/***************** 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 在 演算法...