1. 程式人生 > >夜深人靜寫演算法——線性時間選擇(分治,陣列第n小的數)

夜深人靜寫演算法——線性時間選擇(分治,陣列第n小的數)

線性時間選擇:求陣列中第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);
}