1. 程式人生 > 實用技巧 >簡單實現快速查詢

簡單實現快速查詢

快速查詢

找到陣列中第 N 大(小)的數

用過對快速排序的簡單改造即可實現

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define size 10


int isort(int t[], int length, int k)
{
    int i, j;
    int tmp;
    for(i = 1; i < length; i++) {
        tmp = t[i];
        for(j = i;j > 0; j--) {
            
if(t[j-1] > tmp) // 是與 tmp 比較 而不是 t[j] t[j] = t[j-1]; else break; } t[j] = tmp; } return t[k - 1]; } void swap(int &a, int &b){ int tmp = a; a = b; b = tmp; } int select(int t[], int start, int end) {
int mid = (start + end) / 2; if(t[start] > t[mid]) swap(t[start], t[mid]); if(t[start] > t[end]) swap(t[start], t[end]); if(t[mid] > t[end]) swap(t[mid], t[end]); swap(t[mid], t[end-1]); return t[end-1]; } int msort(int t[], int length, int k) {
int left = 0; int right = length - 1; int watershed; if(length <= 4) { return isort(t, length, k); } watershed = select(t, left, right); int i, j; i = 0; j = right - 1; while(i < j) { while(t[++i] < watershed) {} //i 會在大於等於 watershed 的地方停下 while(t[--j] > watershed) {} //j 會在小於等於 watershed 的地方停下 if(i < j) swap(t[i], t[j]); } swap(t[i], t[right - 1]); if( i + 1 == k) return t[i]; else if(i + 1 > k) msort(t, i + 1,k); else msort(t + i + 1, length -i - 1, k - i - 1); } int main() { time_t seed; int n[size]; int k; seed = time(0); srandom(seed); for(int i = 0; i < size; i++) { n[i] = random()%1000; printf("%d ", n[i]); } printf("\n"); k = msort(n, size, 10); printf(" %d\n", k); return 0; }