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