快排:(若求top m個元素,則只需把下面的程式裡的k換乘n-m即可)
//利用快排求最小的k個數,第k小的數
void getleastknum(int *input,int n,int *output,int k)
else
}for(int i=0;i//其中,output[k-1]就是第k小的數
}//partition函式,時間複雜度是o(n)
int partition(int *a,int low,int high)
//改進的partition函式,o(n)
int partition2(int *a,int low,int high)
利用堆排序:
/****************大根堆排序********************/
void adjustdown(int *a,int s,int n)
}a[s]=a[0];//被篩選節點的值放在最終位置
}void buildmaxheap(int *a,int n)
void heapsort(int *a,int n)//n是指待排序列 的元素個數,陣列a的長度是n+1,a[0]不使用
}//求最小的k個數
int a[n];//陣列a中存放輸入的n個數
int b[k+1];//從a中以此讀入k個數a[0]...a[k-1],第乙個數存在b[1]中,以此類推
buildmaxheap(b,k);//調整b為大根堆
for(int i=k;iif(a[i]>b[1])
continue;
else
}
快排擴充套件 第k小的數
使用快排中的partition方法,可以很快找到乙個無序序列中的第k小的數。思想 對於乙個陣列a 0.n 1 分段成a 0.st 1 a s a st 1.n 1 分組後,a 0.st 1 裡面的元素都小於等於a st a st 1.n 1 裡面的元素都大於等於a st 所以,如果 st k 1,那...
快排的思想求第K小的數
描述輸入n 個數,m 次查詢。每次查詢給出乙個數x。要求 每次查詢輸出前 x個數中第 i小的數。i為第 i次查詢 你可以假設 m n xi xi 1 xi 2 xm xm n 輸入 line0 t line1 n,m line2 linen 1 num1,numn linen 2 linen 2 m...
T28 求最小的K個數(利用快排)
題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,利用快排 利用temp a 0 然後從右到左找比temp小的數 從左往右尋找比temp大的數 指標l 0 指標r a.length 1 直到l r 原始 4,5,1,6,2,...