刷題模板 排序

2021-10-01 05:29:00 字數 2379 閱讀 7452

public void quicksort(int input,int p,int q) 

}public int partition(int input, int p, int q)

swap(input,i,j);

}/***********************==必須***************===**/

input[p] = input[i];

input[i] = temp;

/***********************==必須***************===**/

return i;

}

參考

用於求解topk elements問題,也就是 k 個最小元素的問題。可以維護乙個大小為 k 的最小堆,最小堆中的元素就是最小元素。最小堆需要使用大頂堆來實現,大頂堆表示堆頂元素是堆中最大元素。這是因為我們要得到 k 個最小的元素,因此當遍歷到乙個新的元素時,需要知道這個新元素是否比堆中最大的元素更小,更小的話就把堆中最大元素去除,並將新元素新增到堆中。所以我們需要很容易得到最大元素並移除最大元素,大頂堆就能很好滿足這個要求。

堆也可以用於求解 kth element 問題,得到了大小為 k 的最小堆之後,因為使用了大頂堆來實現,因此堆頂元素就是第 k 大的元素。

快速選擇也可以求解 topk elements 問題,因為找到 kth element 之後,再遍歷一次陣列,所有小於等於 kth element 的元素都是 topk elements。

一般公升序採用大頂堆,降序採用小頂堆

堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖:

大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

二叉樹最後乙個非葉子節點序號:n/2-1(序號從0開始)

堆排序的基本思想是:

1) 從最後乙個非葉子節點開始(因為葉子本身就是堆),將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。

2) 將其與末尾元素進行交換,此時末尾就為最大值。

3) 然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。

如此反覆執行,便能得到乙個有序序列了

//初始化堆:時間複雜度o(n)

private void heapsort(int input)

// 2. 調整堆結構,堆頂元素與末尾元素交換

for (int i = input.length-1; i >= 0; i--)

}/**

* 調整大頂堆,僅僅是調整,這時候大頂堆已經建立好

時間複雜度o(nlogn)

* @param arr

* @param start

* @param length

*/private void adjustheap(int arr, int start, int length)

if (arr[i] > temp)

else

}arr[start] = temp;

}private void swap(int arr,int i,int j)

//兩路歸併演算法,兩個排好序的子串行合併為乙個子串行

public void merge(int a,int left,int mid,int right)

while(p1<=mid) tmp[k++]=a[p1++];//如果第乙個序列未檢測完,直接將後面所有元素加到合併的序列中

while(p2<=right) tmp[k++]=a[p2++];//同上

//複製回原素組

for (int i = left; i <=right; i++)

a[i]=tmp[i];

}public void mergesort(int a,int start,int end){

if(start桶排序!!

下標就是出現的次數

演算法競賽刷題模板2 歸併排序

get to the points first.the article comes from lawsonabs update on 20200622 在給出真正可執行的 之前,我想給出乙個偽 畢竟偽 更好理解和記憶。const int maxn 100005 int arr maxn int su...

C LeetCode刷題 排序

排序篇 題名刷題通過率難度 56合併區間 31.2 中等57 插入區間 30.4 困難75 顏色分類 48.6 中等147 對鍊錶進行插入排序 50.7 中等148 排序鍊錶 52.7 中等164 最大間距 43.0 困難179 最大數 26.7 中等242 有效的字母異位詞 c leetcode刷...

排序演算法刷題

演算法分析 計數排序 複雜度 k n 題目題目描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了 nnn 個 111 到 100010001000 之間的隨機整數 n 100n 100n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不...