得到第K個大的數

2021-04-06 21:17:07 字數 1366 閱讀 8413

第k個大的數就是乙個排序陣列的第k個數

第一種演算法是最容易想到的,就是利用快速排序的思想,將乙個陣列分成以某乙個數x為軸,左邊的所有的數都比x小,而右邊的數都比x大。但我快速排序不同的是,在這個演算法中只考慮x的一邊,而不是兩邊都考慮。

如果x的位置是i,那麼要得到第k個數,如果k<=i, 那麼這個數一定在i的左邊,否則在i的右邊。

原始碼如下:

#include

#include

int new_random(int min, int max)

void swap(int *a, int *b)

int partition(int a, int p, int r)

}swap(&a[i + 1], &a[r]);

return i + 1;

}int randomize_partition(int a, int p, int r)

//第一種演算法

int randomized_select(int data, int p, int r, int k)

另外一種對這種演算法做了一下改進,即將陣列每5個數一組進行排序,然後取得它的中位數,再對這些中位數進行排序。然後先出的軸x最比較好的,因此x的左邊和右邊的數總是很平均,所以平均查詢速度更快。演算法如下:

void quicksort(int data, int b, int e)

}int partition1(int a, int p, int r, int x)

}a[i + 1] = x;

return i + 1;

}//第二種演算法

int select_new(int data, int p, int r, int k)

int i;

for(i = 0; i <= (r - p - 4) / 5; i++)

int x = select_new(data, p, p + (r - p - 4) / 5, (r - p - 4)/10); // 得到更好的軸x

i = partition1(data, p, r, x);

int count = i - p + 1; 

if(k <= count)

return select_new(data, p, i, k);

else

return select_new(data, i + 1, r, k - count);

}int main()

;printf("%d/n", randomized_select(data, 0, 9, 2));

int data1 = ;

printf("%d/n", select_new(data1, 0, 9, 2));

return 0;

}

得到第K個大的數演算法研究

第一種演算法是最容易想到的,就是利用快速排序的思想,將乙個陣列分成以某乙個數x為軸,左邊的所有的數都比x小,而右邊的數都比x大。但我快速排序不同的是,在這個演算法中只考慮x的一邊,而不是兩邊都考慮。如果x的位置是i,那麼要得到第k個數,如果k i,那麼這個數一定在i的左邊,否則在i的右邊。原始碼如下...

得到第K個大的數演算法研究

第一種演算法是最容易想到的,就是利用快速排序的思想,將乙個陣列分成以某乙個數x為軸,左邊的所有的數都比x小,而右邊的數都比x大。但我快速排序不同的是,在這個演算法中只考慮x的一邊,而不是兩邊都考慮。如果x的位置是i,那麼要得到第k個數,如果k i,那麼這個數一定在i的左邊,否則在i的右邊。原始碼如下...

得到第K個大的數演算法研究

第一種演算法是最容易想到的,就是利用快速排序的思想,將乙個陣列分成以某乙個數x為軸,左邊的所有的數都比x小,而右邊的數都比x大。但我快速排序不同的是,在這個演算法中只考慮x的一邊,而不是兩邊都考慮。如果x的位置是i,那麼要得到第k個數,如果k i,那麼這個數一定在i的左邊,否則在i的右邊。原始碼如下...