浼樼偣錛氱紪鐮佺畝鍗曪紝娓呮櫚
緙虹偣錛氬浜庢帓濂藉簭鐨勮緭鍏ワ紝鏃墮棿澶嶆潅搴︿負O(n^2)
static聽int聽partition(int聽*array,int聽start,int聽end);
int聽quicksort(int聽*array,int聽start,int聽end)
{
聽聽聽聽if(array==NULL||start>end)聽return聽0;
聽聽聽聽int聽t聽=聽partition(array,start,end);
聽聽聽聽quicksort(array,start,t-1);
聽聽聽聽quicksort(array,t+1,end);
聽聽聽聽return聽1;
}
static聽int聽partition(int聽*array,int聽start,int聽end)
{
聽聽聽聽int聽pivot聽=聽array[start];聽聽聽聽
聽聽聽聽int聽i聽=聽start;
聽聽聽聽int聽j聽=聽end;
聽聽聽聽while(聽i<j聽){
聽聽聽聽聽聽聽聽while( j>i&& array[j]>=pivot)聽j--;
聽聽聽聽聽聽聽聽array[i]聽=聽array[j];
聽聽聽聽聽聽聽聽while( j>i&& array[i]<=pivot )聽i++;
聽聽聽聽聽聽聽聽array[j]聽=聽array[i];
聽聽聽聽}
聽聽聽聽array[i]聽=聽pivot;
聽聽聽聽return聽i;
}
鏀硅繘錛氬皬鏁扮粍鐩存帴鐢ㄦ彃鍏ユ帓搴忓疄鐜幫紝涓灑鍊煎彇(begin,mid,end)涓夎呯殑涓棿鍊鹼紝瀵規湁搴忔暟緇勬帓搴忎粛涓篛(nlogn)銆傚噺灝戜簡杈圭晫鏉′歡媯鏌?br />緙虹偣錛氱紪鐮佸鏉傘?br />
#include聽<stdio.h>
#include聽<stdlib.h>
#include聽<memory.h>
#define聽SMALL_N聽10
static聽int聽partition(int聽*array,int聽begin,int聽end);
void聽_quicksort(int聽*array,int聽begin,int聽end);
void聽insertsort(int聽*array,int聽len)
{
聽聽聽聽int聽i;
聽聽聽聽if(array==NULL||len==0)
聽聽聽聽聽聽聽聽return;
聽聽聽聽for(i=1;i<len;++i){
聽聽聽聽聽聽聽聽int聽temp聽=聽array[i];
聽聽聽聽聽聽聽聽int聽j;
聽聽聽聽聽聽聽聽for(j=i;j>=1&&temp<array[j-1];--j){
聽聽聽聽聽聽聽聽聽聽聽聽array[j]聽=聽array[j-1];
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽array[j]聽=聽temp;
聽聽聽聽}
}
int聽quicksort(int聽*array,int聽len)
{
聽聽聽聽if(array==NULL||len==0)
聽聽聽聽聽聽聽聽return;
聽聽聽聽_quicksort(array,0,len-1);
}
void聽_quicksort(int聽*array,int聽begin,int聽end)
{
聽聽聽聽int聽pivot;
聽聽聽聽int聽pivot_pos;
聽聽聽聽if(end-begin+1<=SMALL_N){
聽聽聽聽聽聽聽聽insertsort(&array[begin],end-begin+1);
聽聽聽聽聽聽聽聽return;
聽聽聽聽}
聽聽聽聽pivot_pos聽=聽partition(array,begin,end);
聽聽聽聽_quicksort(array,begin,pivot_pos-1);
聽聽聽聽_quicksort(array,pivot_pos+1,end);
}
static聽int聽聽mid3(int聽*array,int聽begin,int聽end)
{
聽聽聽聽int聽mid聽=聽(end-begin)/2+begin;
聽聽聽聽int聽tmp;
聽聽聽聽tmp聽=聽array[mid];
聽聽聽聽if(tmp<array[begin]){
聽聽聽聽聽聽聽聽array[mid]聽=聽array[begin];
聽聽聽聽聽聽聽聽array[begin]聽=聽tmp;
聽聽聽聽}
聽聽聽聽tmp聽=聽array[end];
聽聽聽聽if(tmp<array[mid]){
聽聽聽聽聽聽聽聽array[end]聽=聽array[mid];
聽聽聽聽聽聽聽聽if(tmp<array[begin]){
聽聽聽聽聽聽聽聽聽聽聽array[mid]聽=聽array[begin];
聽聽聽聽聽聽聽聽聽聽聽array[begin]聽=聽tmp;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽else{
聽聽聽聽聽聽聽聽聽聽聽聽array[mid]聽=聽tmp;
聽聽聽聽聽聽聽聽}
聽聽聽聽}
聽聽聽聽tmp聽=聽array[end-1];
聽聽聽聽array[end-1]聽=聽array[mid];
聽聽聽聽array[mid]聽=聽tmp;
聽聽聽聽
聽聽聽聽return聽array[end-1];
}
static聽int聽partition(int聽*array,int聽begin,int聽end)
{
聽聽聽聽int聽pivot聽=聽mid3(array,begin,end);
聽聽聽聽int聽i,聽j;
聽聽聽聽int聽tmp;
聽聽聽聽i聽=聽begin;
聽聽聽聽j聽=聽end-1;
聽聽聽聽while(1){
聽聽聽聽聽聽聽聽while(array[++i]<pivot)聽;
聽聽聽聽聽聽聽聽while(array[--j]>pivot)聽;
聽聽聽聽聽聽聽
聽聽聽聽聽聽聽if(i>j)
聽聽聽聽聽聽聽聽聽聽break;
聽聽聽聽聽聽聽tmp聽=聽array[j];
聽聽聽聽聽聽聽array[j]聽=聽array[i];
聽聽聽聽聽聽聽array[i]聽=聽tmp;
聽聽聽聽}
聽聽聽聽tmp聽=聽array[i];
聽聽聽聽array[i]聽=聽array[end-1];
聽聽聽聽array[end-1]聽=聽tmp;
聽聽聽聽return聽i;
}

]]>