当前位置:   article > 正文

快速排序详解及JAVA/C++实现_快速排序c++和java

快速排序c++和java

快速排序(Quicksort)的主要思想是,通过某种O(n)的方法,将乱序数组分为左右两部分,使得左边的元素小于右边的元素,然后进行递归。平均来说,复杂度是O(nlog(n)).

方法一(比较繁琐):

快速排序的关键在于如何用O(n)的时间将数组分为左右两部分。不妨设临界元素pivot=array[0],将数组分为比pivot大和小两部分。我们利用两个指针left_index以及right_index,使得下标小于left_index的元素小于等于pivot,下标大于right_index的元素大于pivot。

首先,left_index右移,当遇到大于pivot的元素时,停止右移,将该元素与right_index的元素置换,此时可以将right_index向左移一位。

然后,right_index左移,当遇到小于等于pivot的元素时,停止左移,将该元素与left_index的元素置换,此时可以将left_index向右移一位。

然后,left_index右移 ...

直到left_index < right_index + 1,此时,数组的分割过程结束。(注意:两个指针左右移动的次数是O(n)的)

此时,可以将pivot元素(array[0])与左右的临界点交换。使得数组左边小于pivot,右边大于pivot,可以进行递归了。

方法二(比较简单,详见函数quick_sort_2):

思路:从左边找到第一个大于pivot的元素(下标为left_index),从右边找到第一个小于pivot的元素(下标为right_index),如果left_index<right_index,则交换两个元素。

代码如下

  1. public class import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class QuickSort {
  5. public static int [] random_order_array(int len){
  6. List
  7. list = new ArrayList
  8. ();
  9. for (int i = 0; i < len; i ++){
  10. list.add(i);
  11. }
  12. Collections.shuffle(list);
  13. int [] array = new int [len];
  14. for (int i = 0; i < len; i ++)
  15. array[i] = list.get(i);
  16. return array;
  17. }
  18. public static void quick_sort(int [] array, int start, int end){
  19. if (start == end) return;
  20. if (start == end - 1){
  21. if (array[start] > array[end])
  22. swap(array, start, end);
  23. return;
  24. }
  25. int pivot = array[start];
  26. int left_index = start + 1; // array[left_index] 左边的元素(不包含),都小于或者等于pivot
  27. int right_index = end; // array[end_index] 右边的元素(不包含),都严格大于pivot
  28. while (left_index < right_index + 1){
  29. while (left_index < right_index + 1){
  30. if (array[left_index] > pivot){
  31. swap(array, left_index, right_index);
  32. right_index --;
  33. break;
  34. }
  35. left_index ++;
  36. }
  37. while (left_index < right_index + 1){
  38. if (array [right_index] <= pivot){
  39. swap(array, left_index, right_index);
  40. left_index ++;
  41. break;
  42. }
  43. right_index --;
  44. }
  45. }
  46. swap(array, start, left_index - 1);
  47. if (start < left_index - 1) quick_sort(array, start, left_index - 2);
  48. if (end > right_index + 1) quick_sort(array, right_index + 1, end);
  49. }
  50. public static void quick_sort_2(int [] array, int start, int end){
  51. if (start == end) return;
  52. if (start == end - 1){
  53. if (array[start] > array[end])
  54. swap(array, start, end);
  55. return;
  56. }
  57. int pivot = array[start];
  58. int left_index = start + 1;
  59. int right_index = end;
  60. while (true){
  61. while (left_index <= end && array[left_index] < pivot)
  62. left_index ++;
  63. while (right_index > start && array[right_index] > pivot)
  64. right_index --;
  65. if (left_index >= right_index)
  66. break;
  67. swap(array, left_index, right_index);
  68. }
  69. swap(array, start, left_index - 1);
  70. if (start < left_index - 1) quick_sort(array, start, left_index - 2);
  71. if (end > right_index + 1) quick_sort(array, right_index + 1, end);
  72. }
  73. public static final void swap(int [] array, int i, int j){ //内联函数,更快
  74. if (i != j){
  75. array[i] = array[i] ^ array[j];
  76. array[j] = array[i] ^ array[j];
  77. array[i] = array[i] ^ array[j];
  78. }
  79. }
  80. public static void print_array(int [] array){
  81. for (int i = 0; i < array.length; i ++){
  82. System.out.print(array[i] + " ");
  83. }
  84. System.out.println();
  85. }
  86. public static void main(String [] args){
  87. int len = 20;
  88. int [] array = random_order_array(len);
  89. //int [] array = {8, 4, 0, 6, 1, 9, 3, 7, 2, 5 };
  90. System.out.println("乱序数组:");
  91. print_array(array);
  92. //quick_sort(array, 0, len - 1);
  93. quick_sort_2(array, 0, len - 1);
  94. System.out.println("排序后数组:");
  95. print_array(array);
  96. }
  97. }

另外,C++的实现如下:

  1. # include <iostream>
  2. # include <ctime>
  3. # include <cstdlib>
  4. using namespace std;
  5. int rand_int(int start, int end);
  6. void print_array(int * array, int len);
  7. void quick_sort(int * array, int len);
  8. void swap(int * array, int i, int j);
  9. int * rand_array(int n);
  10. int main(){
  11. srand(time(0));
  12. int len = 20;
  13. int * array = rand_array(len);
  14. print_array(array, len);
  15. quick_sort(array, len);
  16. print_array(array, len);
  17. return 0;
  18. }
  19. void print_array(int * array, int len){
  20. int * temp = array;
  21. for (int i = 0; i < len; i ++){
  22. cout << * (temp ++) << " ";
  23. }
  24. cout << endl;
  25. }
  26. int rand_int(int start, int end){
  27. return start + rand() % (end - start + 1);
  28. }
  29. void quick_sort(int * array, int len){
  30. if (len <= 1) return;
  31. int left_index = 0;
  32. int right_index = len - 1;
  33. for (int w = 0; w < len; w ++){
  34. while (array[left_index] <= array[0] && left_index <= right_index) left_index ++;
  35. while (array[right_index] > array[0] && right_index > left_index) right_index --;
  36. if (left_index >= right_index) break;
  37. swap(array, left_index, right_index);
  38. }
  39. swap(array, 0, left_index - 1);
  40. quick_sort(array, left_index - 1);
  41. quick_sort(array + right_index, len - left_index);
  42. }
  43. void swap(int * array, int i, int j){
  44. int temp = array[i];
  45. array[i] = array[j];
  46. array[j] = temp;
  47. }
  48. int * rand_array(int n){
  49. //生成随机的长度为n的数组
  50. //原理参考了http://blog.csdn.net/taobao755624068/article/details/8522953
  51. int * array = new int[n];
  52. for (int i = 0; i < n; i ++)
  53. array[i] = i;
  54. for (int i = 0; i < n; i ++){
  55. int p = rand_int(0, i);
  56. swap(array, p, i);
  57. }
  58. return array;
  59. }




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/449263
推荐阅读
相关标签
  

闽ICP备14008679号