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

    板子:

    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
    
    
    
     
     

     

     

     

  • 相关阅读:
    如何:将控件锁定到 Windows 窗体
    Linux 设置字符集
    sql 批量处理
    解决表被锁了
    oracle 分页模板
    创建用户及表空间
    恢复数据库数据
    instr vs like 效率
    自定义参数转换器
    spring boot 整合MyBatis
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/12692778.html
Copyright © 2011-2022 走看看