題目描述:
給定乙個無序整數陣列,返回這個陣列中第k小的數。
解析:
最平常的思路是將陣列排序,最快的排序是快排,然後返回已排序陣列的第k個數,演算法時間複雜度為o(nlogn),空間複雜度為o(1)。使用快排的思想,但是每次只對patition之後的陣列的一半遞迴,這樣可以將時間複雜度將為o(n)。
在《演算法導論》有詳細敘述 這裡主要用c++實現,實現思路就是先選取當前陣列的第乙個數作為「主軸」,將後面所有數字分成兩部分,前面一部分小於「主軸」,後面一部分大於「主軸」,然後計算前面一部分數字的有多少,如果大於k則遞迴--在前面一部分找第k個數,如果小於k則在後面一部分呢找,此時k要更新一下 k需要減去第一部分數字數目,遞迴查詢。遞迴的細節自己掌握以下就行,思路基本就是這樣。
**實現:
#include #include #include #include #include using namespace std;
/*題目描述:
給定乙個無序整數陣列,返回這個陣列中第k小的數。
實現思路: 就是先選取當前陣列的第乙個數作為「主軸」,將後面所有數字分成兩部分,前面一部分小於「主軸」,後面一部分大於「主軸」,然後計算前面一部分數字的有多少,如果大於k則遞迴--在前面一部分找第k個數,如果小於k則在後面一部分呢找,此時k要更新一下 k需要減去第一部分數字數目,遞迴查詢
*/void swap(int *p, int *q)
int findnumberk(vector&vec, int k, int s, int e)
// 快速排序(折半縮小遞迴區間的方法)查詢 the k
}swap(&vec[s], &vec[j]);
if(be == k - 1 )
return roll;
else if (be < k - 1)
else
return findnumberk(vec, k, s, j - 1);
}int main()
cout << "input k: " << endl;
cin >> k;
int number = findnumberk(a , k, 0 ,a.size() - 1);
cout << "test result: " << number<< endl;
/*the next use sort 模板快排進行結果驗證
*/sort(a.begin(), a.end(), less());
cout << "real result: " << a[k-1] << endl;
return 0;
}
執行結果: 從無序陣列中找出第K大的數
該題目的兩種實現方式,第一種是用堆排序 其中陣列用到了二叉樹的性質 第二種是利用快速排序來實現.最大堆進行公升序排序,主要步驟是 1.初始化堆 將數列a 1.n 構造成最大堆。2.交換資料 將a 1 和a n 交換,使a n 是a 1.n 中的最大值 然後將a 1.n 1 重新調整為最大堆。接著,將...
演算法設計 查詢無序陣列中第K大的數字
給出乙個陣列,要求查詢出這個陣列中按順序排第k大的數字。思路 利用快速排序的思想,把陣列中的元素分治,並計算中間值的位置,如果是k,則這個數就是第k大的數字,如果比k小,那麼再次利用快速排序分治中值以後的資料,如果比k大,則排序前面的數字,直到找到k的位置。下面給出c 實現的 include inc...
快速排序 尋找無序陣列中的第k大的數
思路是利用快速排序 因為快速排序的分治思想可以將查詢的範圍縮小 快速排序的思想 low為陣列的起始點,high為陣列的尾部點。交替掃瞄 1.固定陣列的第乙個數為定點,從陣列的尾部high開始往左查詢,直到第乙個比定點小的數,和定點交換,因此當前點為空 high 2.從陣列的起始處,low找到第乙個比...