题目:
输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
解法一:
利用堆排序的小根堆的思想,依次找出最小的数、小第二的数、小第三的数……一直到找出小第K的数。
此办法找出的最小K个数是有序的。
代码:
void Heapift_Samll(int elem[], int node, int length) { int tempElem = elem[node]; int leftChild = 2*node+1; int rightChild = 2*node+2; while(leftChild < length) { rightChild = 2*node+2; if((rightChild < length) && (elem[rightChild] < elem[leftChild])) { if(elem[rightChild] < tempElem) { elem[node] = elem[rightChild]; elem[rightChild] = tempElem; node = rightChild; }else { break; } }else { if(elem[leftChild] < tempElem) { elem[node] = elem[leftChild]; elem[leftChild] = tempElem; node = leftChild; }else { break; } } tempElem = elem[node]; leftChild = 2*node+1; } } void HeapFindMinElem(int elem[], int elemLen, int *minElem, int minElemLen) { //先把数组建立成小根堆 for(int i = elemLen/2-1; i >= 0 ; i--) { Heapift_Samll(elem, i, elemLen); } int tempElem = 0;//交换数据的中间变量 for(int j = elemLen-1; j > elemLen-1-minElemLen; j--) { //将堆首与堆尾交换, tempElem = elem[0]; elem[0] = elem[j]; elem[j] = tempElem; minElem[elemLen-j-1] = tempElem; //重新调整小根堆 Heapift_Samll(elem, 0, j); } }
解法二:
利用快递排序的思想,找出最小的K个数。
此办法找出的最小K个数是无序的。
代码:
void QuickSort(int elem[], int left, int right, int minElemLen) { int referenceElem = elem[left];//划分数组的参照数 int pos = left;//记录排序后参照数的位置 int i = right;//i标记从right位置向前搜索的位置 int j = left;//j标记从left位置向后搜索的位置 while(i > j) { for(; i > j; i--) { if(elem[i] < referenceElem) { elem[pos] = elem[i]; j++; pos = i; break; } } for(; j < i; j++) { if(elem[j] > referenceElem) { elem[pos] = elem[j]; i--; pos = j; break; } } } elem[pos] = referenceElem; PrintfElem(elem, 30); if(((pos-left) == minElemLen) || ((pos-left+1) == minElemLen)) { return; }else if((pos-left) > minElemLen) { QuickSort(elem, left, pos-1, minElemLen); }else if((pos-left) < minElemLen) { QuickSort(elem, pos+1, right, minElemLen-(pos-left)-1); } } void QuickFindMinElem(int elem[], int elemLen, int *minElem, int minElemLen) { if(elem == NULL && elemLen == 0) { return; } if(elemLen < minElemLen) { memcpy(minElem, elem, elemLen*sizeof(int)); return; } QuickSort(elem, 0, elemLen-1, minElemLen); memcpy(minElem, elem, minElemLen*sizeof(int)); }
快递排序请参考:http://blog.csdn.net/mmoojing/article/details/17690657