最小的k個數 第k小的數(利用快排,堆排序)

2021-08-16 02:26:10 字數 858 閱讀 3332

快排:(若求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,...