從n個無序數中找出第K大的數

2021-09-25 22:44:09 字數 1745 閱讀 1662

/*

**************** n個無序數中求第k大數 ****************

*/#include

#include

#include

using

namespace

std;

/*氣泡排序思想,時間複雜度:o(n*k)

*/int findk_2(int a, int

k) }

}return a[k-1];}

/*堆排序思想,時間複雜度:o(nlogk)

*///

將a[s...m]調正為堆,其中除s位置值都符合堆定義

void adjustheap(int a, int s, int

m)

if(a[j]<=tmp)

a[s]=a[j];

s=j;

}a[s]=tmp;

}int findk_3(int a, int

k)

//堆排序

for(int i=len-1;i>=len-k;i--)

return a[len-k]; }/*

快速排序思想,時間複雜度:o(n)

*/int partition(int low, int high, int

a) a[low]=a[high];

while(lowp)

a[high] =a[low];

}a[low] =p;

return

low;

} int findk_1(int a, int k, int low, int

high)

else

if(tmp>k-1

)else

}int quicksort(int a, int low, int

high)

}int

main();

int b = ;

int c = ;

int d = ;

intk;

cout

<<"

輸入k: ";

cin>>k;

quicksort(a,

0, 8

); cout

<<"

快速排序後:

"

int big_k_1 = findk_1(b, k, 0, 8

); printf(

"利用快速排序思想o(n),第%d大的數為:%d\n

", k, big_k_1);

int big_k_2 =findk_2(c, k);

printf(

"利用氣泡排序思想o(n*k),第%d大的數為:%d\n

", k, big_k_2);

int big_k_3 =findk_3(d, k);

printf(

"利用堆排序思想o(nlogk),第%d大的數為:%d\n

", k, big_k_3);

return0;

}

**執行如下:

輸入k: 3

快速排序後:

15 13 11 10 8 6 3 2 1

利用快速排序思想o(n),第3大的數為:11

利用氣泡排序思想o(n*k),第3大的數為:11

利用堆排序思想o(nlogk),第3大的數為:11

從無序陣列中找出第K大的數

該題目的兩種實現方式,第一種是用堆排序 其中陣列用到了二叉樹的性質 第二種是利用快速排序來實現.最大堆進行公升序排序,主要步驟是 1.初始化堆 將數列a 1.n 構造成最大堆。2.交換資料 將a 1 和a n 交換,使a n 是a 1.n 中的最大值 然後將a 1.n 1 重新調整為最大堆。接著,將...

無序陣列中找第K個的數

題目分析 也就是從小往大排,第k小那個數。方法1 排序 nlogn 方法2 利用堆 nlogk 首先將前k個元素構建最大堆,堆頂是前k個元素中第k小的元素。這步複雜度klogk 遍歷剩餘元素 這步複雜度 n k logk 如果新元素 堆頂 堆頂不可能是第k大元素 移除堆頂 將新元素插入堆 否則 新元...

演算法導論 快速找出無序陣列中第k小的數

題目描述 給定乙個無序整數陣列,返回這個陣列中第k小的數。解析 最平常的思路是將陣列排序,最快的排序是快排,然後返回已排序陣列的第k個數,演算法時間複雜度為o nlogn 空間複雜度為o 1 使用快排的思想,但是每次只對patition之後的陣列的一半遞迴,這樣可以將時間複雜度將為o n 在 演算法...