快速排序算法从难到易实现

2022-06-16 14:18:45 浏览数 (1)

难实现:

代码语言:javascript复制
/*
编写一个程序,将一个整型数组中的数据从大到小排列,要求使用快速排序
*/

#include <iostream>
using namespace std;

//快速排序是先挑选一个基准,把比它小的放在左边,比它大的放在右边
//之后在他的左边继续挑选一个基准,执行上述过程
//在它右边也是一样
void swap(int *a,int *b)
{                            /*交换序列中元素的位置*/
  int tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
}

//s,t表示每一序列的首尾元素
void quickSortArray(int array[], int s,int t)
{
    int low,high;
    if(s<t)
    {
        low = s;
        high = t 1;
        while(1)
        {
            do low  ;
            while(array[low]>=array[s] && low!=t);        /*array[s]为基准元素,重复执行low  操作*/

            do high--;
            while(array[high]<=array[s] && high!=s);      /*array[s]为基准元素,重复执行high--操作*/

            if(low<high)
                swap(&array[low],&array[high]);           /*交换array[low]和array[high]的位置*/
            else
                break;
        }
        
        swap(&array[s],&array[high]);                   /*将基准元素与array[high]进行交换*/
        quickSortArray (array,s,high-1);                /*将基准元素前面的子序列快速排序*/
        quickSortArray (array,high 1,t);                /*将基准元素后面的子序列快速排序*/
    }
}

void quickSort(int array[], int arraySize) {
  quickSortArray(array, 0, arraySize-1);
}

main()
{
    int i,array[10];
    printf("Input ten integern");
    for(i=0;i<10;i  )
    {
        scanf("%d",&array[i]);                /*循环输入10个整数*/
    }

    quickSort(array,10);                     /*执行快速选择排序*/
    printf("nThe result of quick sort isn");
    for(i=0;i<10;i  ) {
        printf("%d ",array[i]);                    /*输出排序后的结果*/
  }
    getchar();
  getchar();
}

易实现:

代码语言:javascript复制
#include <algorithm>
#include <cassert>
#include <functional>
#include <iterator>
#include <iostream>
using namespace std;

//先找到中间位置元素,mid
//std::partition 比较比 mid 小的和大的
//最后两部分递归调用快速排序

//C   14
template <class Fd, class Compare=std::less<Fd>>

void quick_sort(Fd first, Fd last, Compare cmp=Compare{})
{
    auto const N=std::distance(first,last);
    if(N<=1) return;

    auto const mid=*std::next(first,N/2);
    auto const mid1=std::partition(first,last,[=](auto const& elem){
        return cmp(elem,mid) ; });
    

     auto const mid2=std::partition(mid1,last,[=](auto const& elem){
        return !cmp(mid,elem); });
    

    quick_sort(first,mid1,cmp);
    quick_sort(mid2,last,cmp);

}

int main()
{
    std::vector<int> data={0,3,1,2,4,6,6,10,5};
    
    quick_sort(data.begin(),data.end(),std::less<int>());

    for(int i=0;i<data.size();i  )
        cout<<data[i]<<endl;
    return 0;
}

博主:菜鸟程序员

初衷:学习资料,程序设计,视觉算法,求职经验,工作心得

0 人点赞