1. 程式人生 > >【分治】簡單說說快排

【分治】簡單說說快排

ostream stdout ++i rand() oid fclose cnblogs clu 快排

說到快拍,大家都會首先想到sort函數這個神奇的東西

但是,我們總得知道快拍主要用的分治思想

所以就說一說快拍吧

首先是分類

快拍主要有三種方式:

一、以第一個數為基準排序

二、以中間的數為基準快排

三、隨機生成一個位置,用這個位置上的數快排

代碼如下:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int n,a[2000002];

/*int rrand(int l,int r)                      //三中用於生成隨機位置
{
    srand((unsigned)time(NULL));
    return (int)(rand()%(r-l+1)+l);
}
*/ void qsort(int l,int r) //以中間的數為基準快排 { int i,j,mid,p; i=l;j=r; mid=a[(l+r)/2]; do { while(a[i]<mid) i++; while(a[j]>mid) j--; if(i<=j) { p=a[i]; a[i]=a[j]; a[j]=p; i++; j
--; } }while(i<=j); if(l<j) qsort(l,j); if(i<r) qsort(i,r); } /*void qsort(int l,int r) //隨機&首位快排 { int i=l,j=r+1,temp=rrand(l,r),k=0; //首位的話是temp=a[i] if(r-l<2) return; while(i<j) { while(i<j) { j--; if(a[j]<temp) { swap(i,j); break; } } while(i<j) { i++; if(a[i]>temp) { swap(i,j); break; } } } a[i]=temp; qsort(l,i); qsort(i+1,r); }
*/ int main() { freopen("sorttest.in","r",stdin); freopen("sorttest.out","w",stdout); scanf("%d",&n); for(int i=n;i>=1;i--) scanf("%d",&a[i]); /*sort(a+1,a+n+1); //喜聞樂見的sort for(int i=1;i<=n;++i)printf("%d ",a[i]); */ qsort(1,n); for(int i=1;i<=n;++i)printf("%d ",a[i]); fclose(stdout); return 0; }

【分治】簡單說說快排