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