百度試題講解 找出陣列中第k大小的數(下節

2021-09-30 08:42:36 字數 1642 閱讀 2577

3,該說堆排序了

堆的定義:

n個關鍵字序列kl,k2,…,kn稱為堆,當且僅當該序列滿足如下性質(簡稱為堆性質):

(1) ki≤k2i且ki≤k2i+1 或(2)ki≥k2i且ki≥k2i+1(1≤i≤)

若將此序列所儲存的向量r[1……n]看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。

堆的這個性質使得可以迅速定位在乙個序列之中的最小(大)的元素。

堆排序演算法的過程如下:1)得到當前序列的最小(大)的元素 2)把這個元素和最後乙個元素進行交換,這樣當前的最小(大)的元素就放在了序列的最後,而原先的最後乙個元素放到了序列的最前面 3)的交換可能會破壞堆序列的性質(注意此時的序列是除去已經放在最後面的元素),因此需要對序列進行調整,使之滿足於上面堆的性質。重複上面的過程,直到序列調整完畢為止。

int makeheap (int * str, int i, int n)

str[i] = tmp;

}int heapsort (int * narray, int n)

// output

for (int i = 0; i < n; i++) cout << narray[i] << ' ';

cout << endl;

return 0;}/*

* eof

*/4,氣泡排序:(這個原理就不說了,直接來**,我也不講了,不會的google去)

using namespace std;

int bubblesort (int * narray, int n)

if (stop == 1) break;

}// output

for (int i = 0; i < n; i++) cout << narray[i] << ' ';

cout << endl;

return 0;

}5,快速排序:

快速排序的演算法思想: 選定乙個樞紐元素(取頭取尾,還是要中間,你自己定),去好之後分割待排序序列進行分割,分割之後的序列乙個部分小於樞紐元素,乙個部分大於樞紐元素,再對這兩個分割好的子串行進行上述的過程。(遞迴啦,好好看**)

using namespace std;

int qajust (int *str, int start, int end)

return start;

}int quiksortdo(int *str, int start, int end)

}int quiksort (int * narray, int n)

6,歸併排序

把待排序序列分成相同大小的兩個部分,依次對這兩部分進行歸併排序,完畢之後再按照順序進行合併。(遞迴思想重要吧?到處都是~)好了,不磨機,直接來**。

using namespace std;

int mergenow(int *str, int start, int mid, int end)

}int mergesortdo(int *str, int start, int end)

}int mergesort (int *narray, int n)

好了,別的排序演算法請各位自己琢磨吧,我就簡單介紹了以上6種常用的排序演算法,不足之處還懇請指出。當然也歡迎新增新的排序演算法~

百度試題講解 排序長陣列

記憶體中有乙個長陣列,條目數為10萬,陣列單元為結構體struct array,sizeof struct array 為512位元組。結構有一int型成員變數weight。現需要取得按weight值從大到小排序的前500個陣列單元,請實現演算法,要求效率盡可能高。解答 思路 這題屬於排序的內容,題...

百度筆試題 陣列重排

給定乙個存放整數的陣列,重新排列陣列使得陣列左邊為奇數,右邊為偶數。要求 空間複雜度o 1 時間複雜度為o n 注 題目 v july v 思路 我的想法是從兩邊遍歷,從左邊遍歷的如果是奇數就繼續留著,從右邊遍歷的如果是偶數就繼續留在右邊,如果是奇數就和從左邊遍歷遇到的第乙個偶數交換,我一下就有了思...

82 第 2 組百度面試題

1.給出兩個集合 a 和 b,其中集合 a 集合 b 要求 問題 1 根據集合 a 中的 name 查詢出集合 b 中對應的屬性資訊 問題 2 根據集合 b 中的屬性資訊 單個屬性,如 age 20 等 查詢出集合 a 中對應的 name。2.給出乙個檔案,裡面包含兩個字段,即 url 為 size...