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

2021-08-26 09:14:51 字數 1808 閱讀 9632

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

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

原始碼如下:

#include 

<

stdio.h

>

#include 

<

stdlib.h

>

intnew_random(

intmin, 

intmax)

void

swap(

int*

a, int*b)

intpartition(

inta, 

intp, 

intr)

}swap(

&a[i +1

], &

a[r]);

returni +

1;}int

randomize_partition(

inta, 

intp, 

intr)

//第一種演算法

intrandomized_select(

intdata, 

intp, 

intr, 

intk)

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

void

quicksort(

intdata, 

intb, 

inte)

}int

partition1(

inta, 

intp, 

intr, 

intx)

}a[i +1

] =x;returni +

1;}//

第二種演算法

intselect_new(

intdata, 

intp, 

intr, 

intk)

inti;for

(i =

0; i 

<=

(r -p -

4) /5

; i++

)intx =

select_new(data, p, p 

+(r -p 

-4) /

5, (r -p 

-4)/

10); 

//得到更好的軸xi =

partition1(data, p, r, x);

intcount =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));

intdata1 =;

printf(

"%d\n

", select_new(data1, 0, 

9, 2));

return0;

}

得到第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,那麼這個數一...