再叙快速排序

快速排序作为一种优秀的排序算法,我们先来给出其核心思想:递归的,让正确的元素出现在正确的位置。

也就是快速排序有两大要点:

  • 让正确的元素出于正确的位置
  • 递归

让正确的元素出于正确的位置

比如一组数据: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 }

最后附上一个网址:

https://blog.csdn.net/qq_40595682/article/details/102146917

 

posted @ 2020-04-13 17:12  少年π  阅读(238)  评论(0编辑  收藏  举报