以下是一些最基本的排序算法。虽然在 C++ 里可以通过 std::sort() 快速排序,而且刷题时很少需要自己手写排序算法,但是熟习各种排序算法可以加深自己对算法的基本理解,以及解出由这些排序算法引申出来的题目。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| void BubbleSort(vector<int>& nums)
{
for(int i=0;i<nums.size()-1;++i)
{
int flag=1;
for(int j=0;j<nums.size()-i-1;++j)
{
if(nums[j]>nums[j+1])
{
swap(nums[j],nums[j+1]);
flag=0;
}
}
if(flag) return;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| void SelectSort(vector<int>& nums)
{
int n=nums.size();
for(int i=0;i<n;i++)
{
int minindex=i;
for(int j=i+1;j<n;j++)
{
if(nums[j]<nums[minindex]) minindex=j;
}
if(minindex!=i) swap(nums[minindex],nums[i]);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| void InsertSort(vector<int>& nums)
{
for(int i =1;i<nums.size();++i)
{
int key=nums[i];
int j=i-1;
while(j>=0&&nums[j]>key)
{
nums[j+1]=nums[j];
j--;
}
nums[j+1]=key;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| void ShellSort(vector<int>& nums)
{
for(int gap=nums.size()/2;gap>0;gap/=2)
{
for(int i = gap;i<nums.size();i++)
{
int key=nums[i];
int j=i-gap;
while(j>=0&&nums[j]>key)
{
nums[j+gap]=nums[j];
j-=gap;
}
nums[j+gap]=key;
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| int partition(vector<int>& nums,int start,int end)
{
int left=start+1,right=end;
while(left<right)
{
while(nums[left]<=nums[start]&&left<right)
{
left++;
}
while(nums[right]>=nums[start]&&left<right)
{
right--;
}
swap(nums[left],nums[right]);
}
if(nums[left]<nums[start])
{
swap(nums[left],nums[start]);
return left;
}
else
{
swap(nums[left-1],nums[start]);
return left-1;
}
}
void QuickSort(vector<int>& nums,int left,int right)
{
if(left<right)
{
int pivotindex=partition(nums,left,right);
QuickSort(nums,pivotindex+1,right);
QuickSort(nums,left,pivotindex-1);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| class Solution {
public:
void maxheapdown(vector<int>& nums,int i,int heapsize)
{
int l=2*i+1,r=2*i+2,largest =i;
if(l<heapsize&&nums[l]>nums[largest])
{
largest=l;
}
if(r<heapsize&&nums[r]>nums[largest])
{
largest=r;
}
if(largest!=i)
{
swap(nums[largest],nums[i]);
maxheapdown(nums,largest,heapsize);
}
}
void makeheap(vector<int>& nums,int heapsize)
{
for(int i=nums.size()/2-1;i>=0;--i)
{
maxheapdown(nums,i,heapsize);
}
}
int findKthLargest(vector<int>& nums, int k) {
int heapsize=nums.size();
makeheap(nums,heapsize);
for(int i=nums.size()-1;i>=nums.size()-k+1;--i)
{
swap(nums[i],nums[0]);
--heapsize;
maxheapdown(nums,0,heapsize);
}
return nums[0];
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| class Solution {
public:
void sortColors(vector<int>& nums) {
//基数排序,得到桶使用次数
int absmax=0;
for(int num:nums)
{
absmax = abs(num)>absmax?abs(num):absmax;
}
int len=to_string(absmax).size();
//开始排序
vector<vector<int>> bucket;
int mod=10,dev=1;
for(int i=0;i<len;i++,dev*=10,mod*=10)
{
bucket.resize(20);
for(int j=0;j<nums.size();j++)
{
int index=(nums[j]%mod)/dev+10;
bucket[index].push_back(nums[j]);
}
int idx=0;
for(auto vec:bucket)
{
for(int num:vec)
{
nums[idx++] = num;
}
}
bucket.clear();
}
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| #include <iostream>
#include <vector>
using namespace std;
// 合并两个有序子数组
void merge(vector<int>& arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
vector<int> L(n1), R(n2);
for (int i = 0; i < n1; i++) L[i] = arr[left + i];
for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) arr[k++] = L[i++];
else arr[k++] = R[j++];
}
while (i < n1) arr[k++] = L[i++];
while (j < n2) arr[k++] = R[j++];
}
// 迭代归并排序
void mergeSortIterative(vector<int>& arr) {
int n = arr.size();
for (int size = 1; size < n; size *= 2) { // 1, 2, 4, 8, ...
for (int left = 0; left < n - size; left += 2 * size) {
int mid = left + size - 1;
int right = min(left + 2 * size - 1, n - 1);
merge(arr, left, mid, right);
}
}
}
// 测试
int main() {
vector<int> arr = {12, 11, 13, 5, 6, 7};
mergeSortIterative(arr);
cout << "排序后数组: ";
for (int num : arr) cout << num << " ";
return 0;
}
|