演算法導論 第9章 中位元和順序統計學

來源:互聯網
上載者:User

標籤:algorithm   演算法導論   線性時間選擇   



/* *演算法導論 第九章 中位元和順序統計學 *線性時間選擇元素 */#include <iostream>#include <ctime>using namespace std;int minimum(int *arr, int len);int randomizedSelect(int *arr, int p, int r, int i);int randomizedPartition(int *arr, int p, int r);void exchange(int arr[], int i, int j);int partition(int arr[], int p, int r);int select(int *arr, int p, int r, int i);int partitionWithPivot(int *arr, int p, int r, int pivot);void printArray(int arr[], int len, char *str);int getMedian(int *arr, int p, int r);void randomizedQuickSort(int *arr, int p, int r);int main(){int len = 15;int *arr = new int[len];srand(time(NULL));for (int i=0; i<len; i++){arr[i] = rand() % 100;}printArray(arr, len, "原數組");cout<<"最小元素為:"<<minimum(arr, len)<<endl;int i = 3;int elem = randomizedSelect(arr, 0, len-1, i);randomizedQuickSort(arr, 0, len-1);printArray(arr, len, "排序後的數組");cout<<"第 "<<i<<" 小的元素為:"<<elem<<endl<<endl;for (int i=0; i<len; i++){arr[i] = rand() % 100;}printArray(arr, len, "原數組");i = 10;elem = select(arr, 0, len-1, i);randomizedQuickSort(arr, 0, len-1);printArray(arr, len, "排序後的數組");cout<<"第 "<<i<<" 小的元素為:"<<elem<<endl;delete[] arr;return 0;}/* *求數組中的最小值 *時間複雜度為O(n) */int minimum(int *arr, int len){int min = arr[0];for (int i=1; i<len; i++){if (arr[i] < min)min = arr[i];}return min;}/* *隨機化選擇演算法 *選擇arr[p..r]中第 i 小的元素 *使用快速排序中的隨機化劃分方法,平均情況下每次將選擇空間縮小一半 *所以在平均情況下,時間複雜度為O(n) */int randomizedSelect(int *arr, int p, int r, int i){if (p == r){return arr[p];}int q = randomizedPartition(arr, p, r);int k = q - p + 1;if (k == i){return arr[q];} else if (i < k) {return randomizedSelect(arr, p, q-1, i);} else {return randomizedSelect(arr, q+1, r, i-k);}}/* *隨機化快速排序 *期望時間複雜度為O(nlgn) */void randomizedQuickSort(int *arr, int p, int r){if (p < r){int q = randomizedPartition(arr, p, r);randomizedQuickSort(arr, p, q-1);randomizedQuickSort(arr, q+1, r);}}/* *隨機化劃分 */int randomizedPartition(int *arr, int p, int r){srand(time(NULL));int i = p + rand() % (r-p+1);exchange(arr, i, r);return partition(arr, p, r);}void exchange(int arr[], int i, int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}int partition(int arr[], int p, int r){int pivot = arr[r];int i = p - 1;//i前面的(包括i)的元素都是不大於pivot的,i後面的都是大於pivot的元素int j;//j後面的(包括j)都是還沒有劃分的for (j=p; j<=r-1; j++){if (arr[j] <= pivot){i++;exchange(arr, i, j);}}i++;exchange(arr, i, r);return i;}/* *最壞情況下線性時間選擇演算法 *此演算法依然是建立在快速排序的劃分演算法基礎之上的 *但是與randomizedSelect演算法的不同指之處,就是次演算法的本質 *是保證了每次劃分選擇的劃分主元一定是一個較好的主元,演算法先對數組5個一組進行分組 *然後選擇每組的中位元,再遞迴的選擇各組中位元中的中位元作為數組的劃分主元,以此保證劃分的平衡性 *選擇中位元的時候必須使用遞迴調用的方法才能降低時間複雜度 *從而保證在最壞情況下都得到一個好的劃分 *最壞情況下時間複雜度為O(n) */int select(int *arr, int p, int r, int i){if (p == r){return arr[p];}int len = r-p+1;int medianCnt = 1;if (len > 5)medianCnt = len%5 > 0 ? len/5+1 : len/5;int *medians = new int[medianCnt];//使用插入排序找出每組的中位元for (int j=0, k=p; j<medianCnt; j++){if (j == medianCnt-1){medians[j] = getMedian(arr, k, r);} else {medians[j] = getMedian(arr, k, k+4);k += 5;}}//遞迴調用select線性時間函數自身選擇中位元組中的中位元int pivot = select(medians, 0, medianCnt-1, (medianCnt+1)/2);delete[] medians;int q = partitionWithPivot(arr, p, r, pivot);int k = q-p+1;if (i == k){return pivot;} else if (i < k) {return select(arr, p, q-1, i);} else {return select(arr, q+1, r, i-k);}}/* *根據指定的劃分主元pivot來劃分數組 *並返回主元的順序位置 */int partitionWithPivot(int *arr, int p, int r, int pivot){int i = p - 1;int j = p;for (; j<=r; j++){//此處用<較為準確if (arr[j] < pivot){i++;exchange(arr, i, j);}}for (int j=i+1; j<=r; j++){if(arr[j] == pivot){exchange(arr, i+1, j);break;}}return i+1;}/* *利用插入排序選擇中位元 */int getMedian(int *arr, int p, int r){//插入排序for (int i=p+1; i<=r; i++){int key = arr[i];int j = i - 1;while (j >= p && arr[j] > key){arr[j+1] = arr[j];j--;}arr[j+1] = key;}return arr[(p+r)/2];}void printArray(int arr[], int len, char *str){cout << str << endl;for (int i=0; i<len; i++){cout << arr[i] << " ";}cout << endl;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.