快速排序作为一种优秀的排序算法,我们先来给出其核心思想:递归的,让正确的元素出现在正确的位置。
也就是快速排序有两大要点:
- 让正确的元素出于正确的位置
- 递归
让正确的元素出于正确的位置
比如一组数据:5 7 2 4 3 6 9 8;我们知道当这个数组排好序后:
2出现在索引为0的位置,且它前面的数都比它小(此时它前面没有数),它后面都比它大
3出现在索引为1的位置,且它前面的数都比它小(此时它前面为2),它后面都比它大
4出现在索引为1的位置,且它前面的数都比它小(此时它前面为2,3),它后面都比它大
....
所以,借助于这一特性:我们定义让正确的元素出于正确的位置:对于一个数,保证这个数前面的数都比它小(而不用管它前面的数是否排好序),且保证它后面的数都比它大(而不用管它后面的数是否拍好序),那么这个数就处在一个正确的位置(也就是这个数处在它应该在的位置,即使后面进一步排序,它的相对位置是不会变的!即使是最终排好序,它仍然在那个位置)。
递归
还是以5 7 2 3 4 6 9 8为例子,假如,我们使得5处在了正确的位置,此时数组变成了:2 4 3 5 7 6 9 8 。为了完成对整个数组的排序,我们需要递归地对5前面的序列[2,4,3]进行同样的操作,对5后面的序列[7 6 9 8]进行同样的操作,使得数字2和数字7都处于正确的位置。
进一步递归......从而完成了对所有数据的排序
代码如下:
int Partition(int A[], int left, int right) { int temp = A[left];//使得A[left]处于正确的位置 while(left < right) { while(temp < A[right] && left < right) right--; A[left] = A[right]; while(temp >= A[left] && left < right) left++; A[right] = A[left]; } A[left] = temp; return left; }
上述代码完成了:将数组最左端元素处于一个正确的位置(当然了不一定非要最左端)
void QuickSOrt(int A[], int left, int right) { if(left < right) { int pos = Partition(A, left, right); QuickSOrt(A, left, pos-1); QuickSOrt(A, pos+1, right); } }
上述代码完成了对pos左右两端的递归操作。
完整代码:
1 #include <iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int Partition(int A[], int left, int right) 6 { 7 int temp = A[left]; 8 while(left < right) 9 { 10 while(temp < A[right] && left < right) right--; 11 A[left] = A[right]; 12 while(temp >= A[left] && left < right) left++; 13 A[right] = A[left]; 14 } 15 A[left] = temp; 16 return left; 17 } 18 19 void QuickSOrt(int A[], int left, int right) 20 { 21 if(left < right) 22 { 23 int pos = Partition(A, left, right); 24 QuickSOrt(A, left, pos-1); 25 QuickSOrt(A, pos+1, right); 26 } 27 28 } 29 30 int main() 31 { 32 int A[11] = {35,18,16,72,24,65,12,88,46,28,55}; 33 QuickSOrt(A, 0, 10); 34 for(int i = 0; i< 11; i++) 35 { 36 printf("%d ", A[i]); 37 } 38 return 0; 39 }
最后附上一个网址: