快速选择实例
功能:查找集合S中第k個(gè)最小元。
快速選擇算法修改自快速排序算法,當(dāng)算法終止時(shí),第k個(gè)最小元就在位置k上。這破壞了原來(lái)的排序;如果不希望這樣,那么需要做一份拷貝。
快速選擇函數(shù):
/* quick_select.h */#ifndef _QUICK_SELECT_H #define _QUICK_SELECT_Hvoid qselect(int array[], int k, int left, int right);#endif /* quick_select.c */#include "quick_select.h" #include "common.h" #include "insertion_sort.h" #include "quick_sort.h"#define CUTOFF (3)/* places the kth smallest element in the kth position */ /* because arrays start at 0, this will be index k-1 */ void qselect(int array[], int k, int left, int right) {int i, j;int pivot;if(left + CUTOFF <= right){pivot = median3(array, left, right);i = left; j = right - 1;for(;;){while(array[++i] < pivot){}while(array[--j] > pivot){}if(i < j)swap(&array[i], &array[j]);else break;}swap(&array[i], &array[right - 1]);if(k <= i)qselect(array, k, left, i - 1);else if(k > i + 1)qselect(array, k, i + 1, right);}elseinsertion_sort(array + left, right - left + 1); }其中,
common.h參考:http://www.cnblogs.com/nufangrensheng/p/3665397.html;
insertion_sort.h參考:http://www.cnblogs.com/nufangrensheng/p/3657887.html;
quick_sort.h參考:http://www.cnblogs.com/nufangrensheng/p/3669915.html
測(cè)試函數(shù):
/* quick_select_test.c */#include "quick_select.h" #include "common.h" #include <stdio.h>int main(void) {int array[] = {8, 4, 3, 2, 9, 0, 5, 7, 6, 1};printf("array :");print_array(array, 10);qselect(array, 3, 0, 9);printf("the 3th smallest element is %d\n", array[2]);return 0; }測(cè)試結(jié)果:
總結(jié)
- 上一篇: 自制WiFiPineapple
- 下一篇: lua工具库penlight--08额外