面试准备--算法
1.快速排序,寻找第k大的数
思想:分治法
#include <stdio.h> int partation(int *data,int begin,int end) { int key = data[begin]; while(begin < end) { while(begin < end && data[end] >= key) {end--;} if (begin < end) {data[begin++] = data[end];} while(begin < end && data[begin] <= key) {begin++;} if (begin < end){data[end--]=data[begin];} } data[begin] = key; return begin; } void quicksort(int *data,int begin,int end) { if (begin < end) { int part = partation(data,begin,end); quicksort(data,begin,part-1); quicksort(data,part+1,end); } } int find_k(int *data,int begin,int end,int k) { while (begin < end && k >= begin && k <= end) { int part = partation(data,begin,end); if (part == k) {return data[k];} else if (k < part) {end = part - 1;} else {begin = part + 1;} } if (k >= begin && k <= end) return data[begin]; else return -1; } int main() { #if 0 int data[] = {10,1,10,1}; quicksort(data,0,sizeof(data)/sizeof(int)-1); for (int i = 0 ;i < sizeof(data)/sizeof(int);i++) { printf("%d\t",data[i]); } #endif int data[] = {10,5,200,1000,1,100000,5,312,333,22,11,2}; printf("%d\n",find_k(data,0,sizeof(data)/sizeof(int)-1,sizeof(data)/sizeof(int)-1)); for (int i = 0 ;i < sizeof(data)/sizeof(int);i++) { printf("%d\t",data[i]); } }

浙公网安备 33010602011771号