快速排序

板子:

1,从数列中挑出一个元素,称为 “基准”(pivot);

2,重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

3,递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

先以最左边的为一个基准,先从右边往左找一个 <pivot 的数,再从左往右找一个 >pivot 的数,然后交换,如果i=j,交换基准和i=j时的那个数,用变量 i 和变量 j 指向序列的最左边和最右边。刚开始时最左边 i=0 指向 pivot,最右边 j=最右边 指向 最后一个元素 ;

快速排序是不稳定的算法,它不满足稳定算法的定义。
算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

code:

//从小到大

void quickSort(int left, int right, vector<int>& arr)
{
    if(left >= right)
        return;
    int i, j, pivot, temp;
    i = left, j = right;
   pivot = arr[left];  //取最左边的数为基准数
    while (i < j)
    {
        while (arr[j] >= pivot && i < j)
            j--;
        while (arr[i] <= pivot && i < j)
            i++;
        if(i < j)
        {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    //基准数归位
    arr[left] = arr[i];
    arr[i] = pivot;
    quickSort(left, i - 1, arr);//递归左边
    quickSort(i + 1, right, arr);//递归右边
}
//从大到小
code;
void quickSort(int left, int right, vector<int>& arr)
{
    if(left >= right) //递归边界条件
        return;
    if(left < 0 || right >= arr.size())
        return;//非法输入判断,防止数组越界
    int i, j, pivot, temp;
    i = left, j = right;
    pivot = arr[left];  //取最左边的数为基准数
    while (i < j)
    {
        while (arr[j] <= pivot && i < j)
            j--;
        while (arr[i] >= pivot && i < j)
            i++;
        if(i < j)
        {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    //基准数归位
    arr[left] = arr[i];
    arr[i] = pivot;
    quickSort(left, i - 1, arr);//递归左边
    quickSort(i + 1, right, arr);//递归右边
}

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 void quicksort(vector<int>& nums, int low, int high){
 7     if(low<high)
 8     {
 9         int i = low, j = high,t;
10         int temp = nums[low];
11         while(i<j){
12             while(i<j&&nums[j]>=temp)
13                 j--;//先 从右向左找第一个小于temp的数,因为在j--的过程中会出现j<i的情况所以while语句中必须包含i<j
14             while(i<j && nums[i]<= temp)
15                 i++;// 后从左向右找第一个大于等于temp的数
16             if(i<j)
17               {
18                   t=nums[i];
19                   nums[i]=nums[j];
20                   nums[j]=t;
21               }
22         }
23         nums[low]=nums[i];
24         nums[i] = temp;
25         quicksort(nums, low, i-1);
26         quicksort(nums, i+1, high);
27     }
28 }
29 
30 int main()
31 {
32     int n;
33     while(cin>>n){
34         vector<int>nums(n);
35         for(int i =0;i<n;++i){
36             cin>>nums[i];
37         }
38         quicksort(nums, 0, n-1);
39         for(int i =0;i<n;++i){
40             cout<<nums[i]<<" ";
41         }
42     }
43     return 0;
44 }
View Code


 
 

 

 

 

原文地址:https://www.cnblogs.com/sweetlittlebaby/p/12692778.html