1.归并排序
1.1 算法原理
- 将一组数据一分为二。
- 对两组数据不断递归排序,直至每组数据为最下规模。
- 将排序好的两组数据进行合并。
1.2 实现代码
#include <iostream>
#include <vector>
void Merge(std::vector<int>&a,int left, int right, int mid){
int index1 = left;
int index2 = mid + 1;
int k = 0;
std::vector<int> temp(right - left + 1,0);
while(index1 <= mid && index2 <= right){
if(a[index1] < a[index2]){
temp[k++] = a[index1++];
}else{
temp[k++] = a[index2++];
}
}
while(index1 <= mid){
temp[k++] = a[index1++];
}
while(index2 <= right){
temp[k++] = a[index2++];
}
for(int i = left, k = 0; i <= right; i++,k++){
a[i] = temp[k];
}
}
void MergeSort(std::vector<int>&a,int left,int right){
if(left >= right) return;
int mid = (left + right) / 2;
MergeSort(a,left,mid);
MergeSort(a,mid+1,right);
Merge(a,left,right,mid);
}
1.3 复杂度分析
2.快速排序
2.1 算法原理
- 设立分界值,一般为第一个元素或者最后一个元素。
- 将小于分界值的放到数组 左边,大的放到右边。
- 递归调用。
2.2 实现代码
#include <iostream>
#include <vector>
void QuickSort(std::vector<int> &a,int left,int right){
if(left >= right)return;
int key = a[left];
int i = left;
int j = right;
while(i < j){
while(i < j && key <= a[j]){
j--;
}
a[i] = a[j];
while(i < j && key >= a[i]){
i++;
}
a[j] = a[i];
}
a[i] = key;
QuickSort(a,left,key - 1);
QuickSort(a,key + 1,right);
}
int main()
{
std::vector<int> a{2,1,5,6,3,4,8,7,9,0};
QuickSort(a,0,a.size());
for(auto &e : a){
std::cout << e << std::endl;
}
return 0;
}
2.3 复杂度分析
- 最好情况下,时间复杂度为O(nlogn)。
- 最坏情况下,时间复杂度为O(n)。
- 是一种不稳定的算法。