選取第乙個數為哨兵
將比哨兵小的數都交換到前面,比哨兵大的數都交換到後面
返回哨兵位置,根據哨兵位置劃分左右區間重複第二步,直到各區間只有乙個數。
int partition(vector&nums, int left, int right)
// 再找左邊,只要左邊的數<=哨兵就繼續
while(i < j && nums[i] <= key)
swap(nums[i], nums[j]); // // 走到這步時,一定有nums[i] > nums[left] 而nums[j] < nums[left],為了nums[i] < nums[j] 所以要進行交換
}swap(nums[i], key); // 最後將哨兵放到正確的位置上,完成一次partition
return i; // 最後返回哨兵所在位置
}void quicksort(vector&nums, int left, int right)
將陣列劃分為左右兩個區間,區間內再劃分左右區間,直到左右區間中只有乙個元素(劃分),通過遞迴實現
對左右區間元素進行合併, 也就是merge的過程、
merge的思想是設定乙個長度為左右兩區間長度和的輔助陣列,設定兩個指標分別從左子區間和右子區間的起始處開始,比較這兩個指標指向的元素,誰更小就把誰放到輔助陣列中,同時該指標+1。
當某個區間的指標已經走到頭時,跳出迴圈。將剩餘的沒有走到頭的區間的元素全部搬到輔助陣列中。
將輔助陣列中的元素更新到原陣列中。完成一次合併排序。
void merge(vector&nums, int left, int mid, int right)
else
}while(i <= mid)
while(j <= right)
for(int i = 0; i < tmp.size(); i++)
}void mergesort(vector&nums, int left, int right)
思想: 堆是用陣列構建的,乙個節點i它的左右子節點在陣列中的位置分別為2 * i + 1, 2 * i + 2。
首先建立乙個堆,然後每次從堆中拿出堆頂元素與陣列的最後乙個元素交換,再對堆進行調整,迴圈n次,可以得到排序後的陣列。
// 小根堆
void sift(vector&nums, int index, int size)
if(nums[i] < nums[j]) break;
else
}}void heapsort(vector&nums)
// 排序,重複移走堆頂元素,再調整堆
for(int i = 0; i < n; i++)
}
氣泡排序就是把小(或大)的元素往前調,比較的是相鄰兩個元素,交換也發生在這兩個元素之間。
比較相鄰的元素,如果第二個比第乙個大,就交換他們兩個。
對每一對相鄰的元素執行步驟一,從開始到結尾,最後乙個元素會是最大的數。
每次對越來越少的元素重複上面的步驟
void bubblesort(vector&nums)}}
}
每一步將乙個待排序的資料插入到前面已經排好序的有序序列中,直到插完所有元素為止。
初始有序序列為陣列第乙個元素
void insertsort(vector&nums)
nums[j + 1] = nums[j];
}nums[j + 1] = key;
}}
希爾排序是對直接插入排序的改進,採用插入排序的方法,先讓陣列中任意間隔為h的元素有序,剛開始h=n/2,接著讓h=n/4,讓h一直縮小,當h=1時,也就是此時陣列中任意間隔為1的元素有序。
排序完成。
void shellsort(vector& nums)
nums[j + dis] = key;}}
}
思想:給每個位置選擇當前元素最小的
在未排序的陣列中找到最大(小)元素,存放到排序序列的起始位置
從剩餘未排序的元素中繼續找最大(小)元素放到已排序序列的末尾
重複直到所有元素均排序
void selectsort(vector&nums)
}swap(nums[i], nums[maxindex]);
}}
思想:利用額外的陣列空間,但是元素需要在0~k之間,不能小於0
首先找到待排序陣列中最大和最小的元素,以最大元素值為長度構建輔助陣列
統計待排序陣列中每個值出現的次數,以值為下標,次數為值放入輔助陣列中
遍歷輔助陣列,從中按順序拿出陣列值(出現次數)不為0的下標,每拿一次,次數減一,直到為0
拿出所有後排序完成。
本質是將值轉化為陣列索引進行排序。
將陣列分到有限數量的桶裡,每個非空的桶再分別排序,從不是空的桶子裡把元素再拿出來放回原來序列中。
也是一種桶排序,將整數按位數切分為不同的數字(個位, 十位,百位...),從最低為開始,依次進行桶排序。
所有位數字排序完成後,排序完成
總結:計數排序,桶排序和基數排序都用到了同的概念,
十大排序演算法
1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...
十大排序演算法
排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...
十大排序演算法
github 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序...