目录
一,快速排序(时间复杂度为O(NlogN),最坏情况为O(N))
一,快速排序(时间复杂度为O(NlogN),最坏情况为O(N))
对于快速排序,我们得思路是,选择一个值做为我们得分界点(一般为数组得第一个元素),使得数组左边得数都小于这个值,数组右边得数都大于这个值
附上代码如图:
#include<iostream> //快速排序模板 时间复杂度O(NlogN),最差情况下为O(N^2)
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n;
void quick_sort(int a[], int l, int r)
{
if (l >= r)
return;
int x = a[l]; //一定为左边界l
int i = l - 1, j = r + 1; // 防止边界问题
while (i < j)
{
do i++; while (a[i] < x); //分治,让左边的数都小于x
do j--; while (a[j] > x); // 让右边的数大于x
if (i < j)
swap(a[i], a[j]);
}
quick_sort(a, l, j); //注意,j不能改为i,否则会死循环
quick_sort(a, j + 1, r);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
quick_sort(a, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
二,归并排序(时间复杂度为O(Nlog N))
归并排序得思想和快速排序差不多,都是基于分治,归并排序选取得值为数组长度得中间值,将数组分割成多个小数组,然后再将他们合并,归并排序相较于快速排序比较稳定
附上代码如图:
#include<iostream> //归并排序模板,比快速排序稳定,时间复杂度O(N)
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N],tmp[N];
int n;
void merge_sort(int a[], int l, int r)
{
if (l >= r)
return;
int mid = (l + r) >> 1;
merge_sort(a, l, mid); //分治,分为左半边和右半边
merge_sort(a, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while ( i<=mid &&j<=r) //将左右两边合并为有序数组
{
if (a[i] <= a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while (i <= mid)
tmp[k++] = a[i++];
while (j <= r)
tmp[k++] = a[j++];
for (i = l, j = 0; i <= r; i++, j++) //将临时数组中排序好的值放回原数组中
a[i] = tmp[j];
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
merge_sort(a, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}