快速排序的插排隨機主元三數取中優化C語言實現

2021-07-09 13:46:41 字數 2036 閱讀 8642

***//寫了一下對快速排序的各種優化

//證明的話有時間會寫出分析

//只自己打了一些**大家隨意看看

//如果有錯誤的還望指正***

#define k 11

#include

#include

#include

#define n 30000

int m,n;

int *p1=&m;

int *r1=&n;

//quick sort

void quicksort(int a,int p,int r);//普通的快排

int partition(int a,int p,int r);

void quicksort_insert(int a,int p,int r);//快排+插排

void insertsort(int a,int p,int r);

void quicksort_random(int a,int p,int r);//快排隨機主元

int partition_random(int a,int p,int r);

int random(int p,int r);

int partition_three_random(int a,int p,int r);

void quicksort_three_random(int a,int p,int r);//快排三位取中

void quicksort_three_random_insert(int a,int p,int r);//快排三位取中+插排

void quicksort_random_insert(int a,int p,int r);//快排隨機主元+插排

void quicksort_same(int a,int p,int r);//快排對含有大量重複元素的優化

void partition_same(int a,int p,int r);

int main(void)

void quicksort(int a,int p,int r)//快排

}int partition (int a,int p,int r)

}t=a[i+1];

a[i+1]=a[r];

a[r]=t;

return i+1;

}void quicksort_insert(int a,int p,int r)//快排+插排

else

insertsort(a,p,r);

}void insertsort(int a,int p,int r)

a[i+1]=key;

}}int partition_random(int a,int p,int r)

int random(int p,int r)

void quicksort_random(int a,int p,int r)//快排 隨機主元

}int partition_three_random(int a,int p,int r)

void quicksort_three_random(int a,int p,int r)//快排三數取中

}void quicksort_three_random_insert(int a,int p,int r)

else insertsort(a,p,r);

}void quicksort_random_insert(int a,int p,int r)

else insertsort(a,p,r);

}void partition_same(int a,int p,int r)

else

if(a[j]1;

t=a[i];

a[i]=a[j];

a[j]=t;}}

t=a[i+1];

a[i+1]=a[r];

a[r]=t;

*p1=i-count;

*r1=i+1;

}void quicksort_same(int a,int p,int r)//針對大量重複元素的優化

}

演算法 快速排序 經典快排 隨機快排

經典快排的思路是選取陣列的最後乙個數 x,按照問題一的思路把整個陣列劃分成小於等於 x 大於 x兩個部分,將 x 和 大於 x 部分陣列的第乙個元素交換位置。此時整個陣列劃分成小於等於 x x 大於 x三個部分,也就是這一次排序將 x 值排好位置。再分別對小於等於 x和大於 x中的陣列遞迴劃分,直到...

快速排序的改進 隨機快速排序

快速排序是一種高效的排序方法,但是如果我們的輸入陣列是排好序的乙個陣列,快速排序的執行時間就會變成o n 2 雖然這種情況很少會出現,但我們還是應該避免。演算法導論書籍中的修改方法 在排序方法中隨機化選取主元。根據計算,改進後的方法時間複雜度的期望為o nlgn 下面是改進後的 快速排序 publi...

快速排序和隨機化快排學習

0.基本思想 選定基準值 通常為當前陣列的第乙個元素 經過一系列比較和交換,將比基準值小的放在其左邊,將比基準值大的放在其右邊,這稱為是一次迴圈。include using namespace std void qsort int arr,int low,int high 從右向左找比key小的值 ...