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

2021-09-22 06:01:02 字數 1593 閱讀 1161

第一種演算法是最容易想到的,就是利用快速排序的思想,將乙個陣列分成以某乙個數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個大的數

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