快排(递归排序模板)

操作

1.找到一个枢纽pivotkey ,对于一个一次操作让枢纽左边的值都小于等于pivotkey,枢纽右边的值都大于等于pivotkey

2.一个排序后将该区间分成两部分继续递归排序,直至不符合l<R;

注意对于默认枢纽为第一个元素,你也可以找到 low-high中人一个当作枢纽然后与第一个进行交换



#include<stdio.h>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<time.h>
#define INF 0x3f3f3f3f
#define N 10010
using namespace std;
template<typename T>
void Oneqsort(T *arr,int low,int high)
{
    if(low>=high)
     return;
    T pivotkey;
    int l,r;
    l=low;
    r=high;
    pivotkey=arr[l];
    while(l<r)
    {
        while(l<r&&(!(arr[r]<pivotkey)))r--;
        arr[l]=arr[r];
        while(l<r&&(!(pivotkey<arr[l]))) l++;
        arr[r]=arr[l];
    }
    arr[r]=pivotkey;
    Oneqsort(arr,low,r-1);
    Oneqsort(arr,r+1,high);
}
template <typename T>
void QuickSort(T *arr,int la)//数组首地址 数组长度
{
    Oneqsort(arr,0,la-1);
}
template <typename T>
void Print(T* arr,int len)
{
    for(int i=0;i<len;i++)
        cout<<arr[i]<<" ";
    cout<<endl;
}
int arr[N];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
         srand(time(NULL));
         for(int i=0;i<n;i++)
         {
             arr[i]=rand()%1000;
         }


         Print(arr,n);
         printf("after......\n");
         QuickSort(arr,n);
         Print(arr,n);
    }
}

猜你喜欢

转载自blog.csdn.net/dch19990825/article/details/80243691