排序算法有不少种,但最省时间复杂度的有归并排序和快速排序
归并排序:
归并排序是什么
归并排序,顾名思义,先归后并,就如下方的例子,先将所有数归到各个分区,然后用插入排序恢复
插入排序算法即为双指针,在这个排序算法中很特殊,利用在两个有序的数组中,利用双指针,哪个小则把哪个数放在前面,然后剩下的数也如其法
归并排序的思路
一串数为6 1 3 2 9 8 4
先分为 (6 1 3 2) (9 8 4)
再分为 (6 1) (3 2) (9 8) (4)
然后分为(6) (1) (3) (2) (9) (8) (4)
接着并为(1 6) (2 3) (8 9) (4)
然后分为(1 2 3 6) (4 8 9)
最后合为(1 2 3 4 6 8 9)
其时间复杂度为O(n log n)
归并排序的代码
//归并排序
#include<iostream>
using namespace std;
const int N = 1e6 + 5;
long long arr[N];
long long temp[N];
void marge_sort(int l, int r){
if(l >= r) return;
int mid = l + r >> 1;
marge_sort(l, mid);
marge_sort(mid+1, r);
int k = 0, i = l, j = mid + 1;
while(i <= mid && j <= r){
if(arr[i] <= arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
for(; i <= mid; i++){
temp[k++] = arr[i];
}
for(; j <= r; j++){
temp[k++] = arr[j];
}
for(i = l, j = 0; j < k; i++, j++){
arr[i] = temp[j];
}
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++) cin >> arr[i];
marge_sort(0, n-1);
for(int i = 0; i < n; i++){
cout << arr[i] << " ";
}
}
快速排序
快速排序,也是利用双指针巧妙的交换位置从而完成排序
利用了递归的思想,如果左大于又就交换并再次递归,直到全部排序结束
快速排序代码如下
//快速排序
//快速排序
#include<iostream>
using namespace std;
const int N = 1e5 + 5;
int arr[N];
void q_sort(int arr[], int l, int r){
if(l >= r) return ;
int low = l, high = r, x = arr[l+r >> 1];
while(low < high){
while(arr[low] < x) low++;
while(arr[high] > x) high--;
if(low <= high){
swap(arr[low], arr[high]);
low++, high--;
}
}
q_sort(arr, l, high);
q_sort(arr, low, r);
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> arr[i];
}
q_sort(arr, 0, n-1);
for(int i = 0; i < n; i++){
cout << arr[i] << ' ';
}
}