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 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不...