舍伍德类型概率算法
舍伍德類型概率算法
舍伍德類型概率算法的特點:總能求得問題的一個解,且所求得的解總是正確的。
【問題描述】設計一個快速排序的舍伍德類型概率算法。
【問題解答】快速排序算法的關鍵在于一次劃分中選擇合適的劃分基準元素,如果基準是序列中最小的(或最大的)元素,則一次劃分后得到的兩個子序列不均衡,使得快速排序的時間性能降低。舍伍德型概率算法在一次劃分之前根據隨機數在待劃分序列中隨機確定一個元素作為基準,并把它與第一個元素交換,則一次劃分后得到期望均衡的而兩個子序列,從而使算法的行為不受待排序列的不同輸入實例的影響,使快速排序在最壞情況下的時間性能趨近于平均情況的時間性能,即O()。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std;void disp(int a[],int n) { //輸出a中的所有元素for (int i = 0; i < n;i++) {cout << a[i]<<" ";}cout << endl; }int randa(int a,int b) { //產生一個[a,b]的隨機數return rand() % (b - a + 1) + a; }void swap(int &x,int &y){ //交換x和yint tmp = x;x = y;y = tmp; }int Partition(int a[],int s,int t) { //劃分算法int i = s, j = t;int tmp = a[s]; //用序列的第一個記錄作為基準while (i!=j) { //從序列兩端交替向中間掃描,直到i=j為止while (j>i&&a[j]>=tmp) {j--; //從右向左掃描,找第1個關鍵字小于tmp的a[j]}a[i] = a[j]; //將a[j]前移到a[i]的位置while (i<j&&a[i]<=tmp) {i++; //從左向右掃描,找第1個關鍵字大于tmp的a[i]}a[j] = a[i]; //將a[i]后移到a[j]的位置}a[i] = tmp;return i; } void QuickSort(int a[],int s,int t) { //對a[s..t]元素序列進行遞增排序if (s<t) { //序列中至少存在兩個元素的情況int j = randa(s,t); //產生[s,t]的隨機數jswap(a[j],a[s]); //將a[j]作為基準int i = Partition(a,s,t); QuickSort(a,s,i-1); //對左子序列遞歸排序QuickSort(a,i+1,t); //對右子序列遞歸排序}}int main() {int n = 10;int a[] = { 2,5,1,7,10,6,9,4,3,8 };cout << "排序前:" << endl;disp(a,n);srand((unsigned)time(NULL)); //隨機種子QuickSort(a,0,n-1);cout << "排序后:" << endl;disp(a, n);system("pause");return 0;}【算法分析】從中看出,舍伍德版的快速排序就是在確定性算法中引入隨機性。其優點是計算時間復雜度對所有實例而言相對均勻,但與相應的確定性算法相比,其平均時間復雜度沒有改進。
總結
- 上一篇: 天天快递
- 下一篇: 易语言自定义数据类型转c,转换JSON结