zoukankan      html  css  js  c++  java
  • 再叙快速排序

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

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

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

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

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

  • 相关阅读:
    大白话五种IO模型
    test
    shutil模块(了解)
    isinstance和issubclass
    变量的三个特征
    匿名函数
    javascript location 对象
    select元素javascript常用操作
    设置mysql的用户权限
    jquery
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12692549.html
Copyright © 2011-2022 走看看