夜深人靜寫演算法——線性時間選擇(分治,陣列第n小的數)
阿新 • • 發佈:2018-12-17
線性時間選擇:求陣列中第n小的值
一:
解決的方法是基於快速排序解決的,當快速排序進行一次排序的時候,在參考點左側的都是比參考值小的,右側都是比參考點大的。
(1)參考點的下標等於 n-1,說明參考點就是第n小的值。
(2)參考點的下標大於n-1 , 說明所要求得第n小的值在參考值左側的數組裡,只需要對左側陣列進行快速排序。
(3)參考點的下標小於n-1,說明所要求的第n小的值在參考值右側的數組裡,只需要對右側陣列進行快速排序。
二:
程式如下:
#include <stdio.h> #include <algorithm> #include <iostream> #include <time.h> #include <stdlib.h> #define LENGTH 10 using namespace std; template <class Type> void swap(Type *a,Type *b){ Type c; c = *a; *a = *b; *b = c; } template <class Type> Type QuickSort(Type a[],int l,int r,int n){ //排序從l到r的陣列 if(l < r){ // 如果l >= r 不進行操作 int t = l; int stl = l; //stl為左側的指標 int str = r+1; //str為右側指標 while(true){ while(a[++stl] <= a[t] && stl <= r); //stl掃描到大於 參考值 的值後停止掃描 while(a[--str]> a[t] && str >= 0); //str掃描到小於 參考值 的值後停止掃描 if(str < stl)break; //如果當前str小於stl 說明掃描完一遍,最外層while迴圈停止 swap(&a[stl],&a[str]); //交換兩個指標的值 } swap(&a[l],&a[str]); //交換參考值和str指標指向的值 if(str == n - 1) //如果參考點下標等於n-1,返回參考值 return a[str]; else if(str < n - 1) //參考點下標小於n-1,在右側陣列進行尋找 QuickSort(a,str+1,r,n-1-str); else QuickSort(a,l,str-1,n); //對左側陣列進行尋找 } } int main(){ int n; srand(time(NULL));n= rand()%LENGTH; int a[LENGTH] = { 2,1,3,4,7,5,6,9,8,0}; cout<<"第"<<n<<"小的數為:"; cout<<QuickSort(a,0,LENGTH-1,n); }