區分的主要依據就是演算法是否是基於比較的
leetcode排序
演算法視覺化
圖是leetcode題解上的
這裡不打算具體的說計數排序和桶排序,因為思路較為簡單
**均在leetcode上測試過,可以放心的使用
class
solution
swap
(nums[minn]
, nums[i]);
}return nums;}}
;
從後面未排序的陣列中每次選擇乙個最小的插入到前面即可
class
solution
}return nums;}}
;
通過不斷的交換,每次把前面最大的元素起上去
class
solution
nums[j +1]
= temp;
}return nums;}}
;
對於每乙個新的元素,將其插入到前面已經有序的陣列中
這個寫法是看起來複雜一點但是速度快一點的,之後可以在希爾排序看到另一種寫法,區別只是在於插入有序陣列的過程
快速排序有很多寫法
挖坑填數版本
class
solution
while
(i > l && nums[i]
== nums[i -1]
) i--
;while
(j < r && nums[j]
== nums[j +1]
) j++
;quick_sort
(l, i -
1, nums)
;quick_sort
(j +
1, r, nums);}
vector<
int>
sortarray
(vector<
int>
& nums)
};
個人不太推薦這種寫法,主要是要注意的細節太多了,一不小心寫錯了就沒了
對於這種模板來說,需要判斷的越少越好
class
solution
}swap
(nums[i +1]
, nums[r]);
int ll = i +
1, rr = i +1;
while
(ll > l && nums[ll]
== nums[ll -1]
) ll--
;while
(rr < r && nums[rr]
== nums[rr +1]
) rr++
;quick_sort
(l, ll -
1, nums)
;quick_sort
(rr +
1, r, nums);}
vector<
int>
sortarray
(vector<
int>
& nums)
};
這個版本的雖然看起來臃腫了一些,但是思路清晰,如果不了解具體過程可以看一下leetcode的官方題解,裡面有演示動畫,一看就懂
兩種寫法個人都加了重複元素的判斷,防止演算法在含有較多重複元素的時候退化,主要是為了過洛谷的資料
歸併排序的思路簡單,而且是穩定複雜度不會退化的,還可以用來排序鍊錶,推薦
class
solution
while
(i <= mid) tmp[cnt++
]= nums[i++];
while
(j <= r) tmp[cnt++
]= nums[j++];
for(
int i =
0; i < cnt; i++)}
vector<
int>
sortarray
(vector<
int>
& nums)
};
堆排序唯一要說的就是注意初始化時候的順序,題解裡的堆排序寫的有點長,不方便當做模板記憶,所以我就改造了一下
class
solution
} vector<
int>
sortarray
(vector<
int>
& nums)
return nums;}}
;
為什麼在初始化的時候要逆序,因為在調整上層節點的時候需要保證下面的節點已經滿足了堆的性質,否則你在交換的時候交換的就不一定是最大值,所以自底向上
建議gap就是每次除2
這個寫法就是和上面的插入排序相對應的寫法,減少了swap的次數,可以提高效率
class
solution
nums[k + gap]
= temp;}}
gap /=2
;}return nums;}}
;
這個就是比較簡單的基於swap的寫法,主要小心陣列越界,其實效率差不了多少,這個也比較好寫
class
solution}}
gap /=2
;}return nums;}}
;
這個實現比較巧妙,建議多看一下理解
cnt開到19是因為有負數,即[-9, 9]
class
solution
for(
int i =
1; i <
19; i++
)for
(int i = n -
1; i >=
0; i--
)copy
(buffer.
begin()
, buffer.
end(
), nums.
begin()
);exp *=10
;}return nums;}}
;
常用排序模板
快速排序 其思想是 先選乙個 標尺 用它把整個佇列過一遍篩子,以保證 其左邊的元素都不大於它,其右邊的元素都不小於它。這樣,排序問題就被分割為兩個子區間。再分別對子區間排序就可以了。選擇排序 思想 重複選擇陣列內的最大值,交換到合適的位置。該排序方法比較慢。堆排序 思想 堆實際上是一棵完全二叉樹,利...
排序 C 快速排序模板
無注釋的 include using namespace std const int n 100005 int a n void quicksort int q,int l,int r int index q l r 1 int i l 1,j r 1 while i j while q i ind...
c 模板排序函式
模板函式 對陣列arr進行選擇排序 選擇排序 template void selsectionsort t arr int n 插入排序 改進 templatevoid insertionsort t arr int n 氣泡排序改進 已經排好序的只比較一遍 templatevoid bubbers...