快速排序

来源:互联网 发布:与制工作室长板淘宝 编辑:程序博客网 时间:2024/06/06 14:28
假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:   1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;   2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];   3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;   4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;   5)、重复第3、4步,直到I=J;   例如:待排序的数组A的值分别是:(初始关键数据X:=49)                   A[1]     A[2]     A[3]     A[4]     A[5]      A[6]     A[7]:                     49        38       65       97       76       13        27进行第一次交换后:   27        38       65       97       76       13        49                   ( 按照算法的第三步从后面开始找进行第二次交换后:   27        38       49       97       76       13        65                  ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )进行第三次交换后:   27        38       13       97       76       49        65( 按照算法的第五步将又一次执行算法的第三步从后开始找进行第四次交换后:   27        38       13       49       76       97        65( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )      此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27        38       13       49       76       97        65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。
[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. // #define SWAP(a,b) \  
  5. //                  {\  
  6. //                  (a) = (a) ^(b);(b) = (b) ^ (a);(a) = (a) ^ (b);\  
  7. //                  }  
  8.   
  9. void swap(int *a, int *b)  
  10. {  
  11.     int tmp;  
  12.     tmp = *a;  
  13.     *a = *b;  
  14.     *b = tmp;  
  15. }  
  16.   
  17. int partition(int * arr,int left,int right)  
  18. {  
  19.     int pivotkey;  
  20.   
  21.     pivotkey = arr[left];  
  22.     while(left<right)  
  23.     {     
  24.         // 从右往左找,比关键字小的值,交换后right指向关键字  
  25.         while(left<right && arr[right]>=pivotkey) right--;  
  26. //      SWAP(arr[left],arr[right]);  
  27.         swap(&arr[left],&arr[right]);  
  28.         //从左边找,比关键字大的值,交换后left指向关键字  
  29.         while(left<right && arr[left]<=pivotkey) left++;  
  30.         swap(&arr[left],&arr[right]);  
  31. //      SWAP(arr[left],arr[right]);  
  32.     }  
  33.     return left;  
  34. }  
  35.   
  36. void qSort(int * arr, int left, int right)  
  37. {  
  38.     int par;  
  39.     if (left<right)  
  40.     {  
  41.         par = partition(arr,left,right);  
  42.         qSort(arr,left,par-1);  
  43.         qSort(arr,par+1,right);  
  44.     }  
  45. }  
  46.   
  47. void quickSort(int *arr,int size)  
  48. {  
  49.     qSort(arr,0,size-1);  
  50. }  
  51.   
  52. void print(int *arr,int size)  
  53. {  
  54.     int i;  
  55.   
  56.     for (i = 0; i < size; ++i)  
  57.     {  
  58.         printf("%d ",arr[i]);  
  59.     }  
  60.     printf("\n");  
  61. }  
  62.   
  63. int main(int argc, char const *argv[])  
  64. {  
  65.     int arr[] = {2,3,4,1,5,8,6,10,9,7};  
  66.     int size = sizeof(arr)/sizeof(arr[0]);  
  67.     quickSort(arr,size);  
  68.     print(arr,size);  
  69.     return 0;  
  70. }  
//方法二
[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. // #define SWAP(a,b) \  
  5. //                  {\  
  6. //                  (a) = (a) ^(b);(b) = (b) ^ (a);(a) = (a) ^ (b);\  
  7. //                  }  
  8.   
  9. void swap(int *a, int *b)  
  10. {  
  11.     int tmp;  
  12.     tmp = *a;  
  13.     *a = *b;  
  14.     *b = tmp;  
  15. }  
  16.   
  17. int partition(int * arr,int left,int right)  
  18. {  
  19.     int pivotkey;  
  20.     int temp;  
  21.     pivotkey = arr[left];  
  22.     temp = pivotkey;  
  23.     while(left<right)  
  24.     {     
  25.         // 从右往左找,比关键字小的值,交换后right指向关键字  
  26.         while(left<right && arr[right]>=pivotkey) right--;  
  27. //      SWAP(arr[left],arr[right]);  
  28. //      swap(&arr[left],&arr[right]);  
  29.         arr[left] = arr[right];  
  30.         //从左边找,比关键字大的值,交换后left指向关键字  
  31.         while(left<right && arr[left]<=pivotkey) left++;  
  32. //      swap(&arr[left],&arr[right]);  
  33. //      SWAP(arr[left],arr[right]);  
  34.         arr[right] = arr[left];  
  35.     }  
  36.     arr[left] = temp;  
  37.     return left;  
  38. }  
  39.   
  40. void qSort(int * arr, int left, int right)  
  41. {  
  42.     int par;  
  43.     if (left<right)  
  44.     {  
  45.         par = partition(arr,left,right);  
  46.         qSort(arr,left,par-1);  
  47.         qSort(arr,par+1,right);  
  48.     }  
  49. }  
  50.   
  51. void quickSort(int *arr,int size)  
  52. {  
  53.     qSort(arr,0,size);  
  54. }  
  55.   
  56. void print(int *arr,int size)  
  57. {  
  58.     int i;  
  59.   
  60.     for (i = 0; i < size; ++i)  
  61.     {  
  62.         printf("%d ",arr[i]);  
  63.     }  
  64.     printf("\n");  
  65. }  
  66.   
  67. int main(int argc, char const *argv[])  
  68. {  
  69.     int arr[] = {2,3,4,1,5,8,6,10,9,7};  
  70.     int size = sizeof(arr)/sizeof(arr[0]);  
  71.     quickSort(arr,size);  
  72.     print(arr,size);  
  73.     return 0;  
0 0