1、快速排序
第一步:找基准,采用二分的方式,从数组中找一个基数
元素(一般就去第一个元素为基数)将一串数据分为两串;
第二步:分区,重新排列数组,将小于基数
的元素放左边,大于基数
的元素放右边,相同的值放任意位置,使得基数
成为中间元素;
第三步:递归,将两个组的元素分别进行排序;
稳定性:不稳定,数值相同的两个元素可能交换位置;
时间复杂度:O(nlogn),如果基数
刚好为最大或者最小值则为O(n2);
空间复杂度:O(nlogn),如果基数
刚好为最大或者最小值则为O(n);
使用情况:适合数据量较小的情况;
public static void main(String[] args) {
int[] b = {4, 5, 9, 7, 8, 1, 4, 3, 7, 9, 10};
quickSort(b, 0, b.length - 1);
}
private static void quickSort(int[] b, int left, int right) {
if (left > right) {
return;
}
int i = left;
int j = right;
//temp就是基准位
int temp = b[left];
while (i < j) {
//先看右边,依次往左递减
while (temp <= b[j] && i < j) {
j--;
}
//再看左边,依次往右递增
while (temp >= b[i] && i < j) {
i++;
}
//如果满足条件则交换
if (i < j) {
int t = b[j];
b[j] = b[i];
b[i] = t;
}
}
// 将基数与i=j位置的数据交换,一次生成新的基数,并且将再进行对两头的数据进行递归处理
b[left] = b[i];
b[i] = temp;
//递归调用左半数组
quickSort(b, left, j - 1);
//递归调用右半数组
quickSort(b, j + 1, right);
}
2、归并排序
1、分离
将已有数列不断分离成两段长度基本相同(当已有数列长度是奇数时,则一半长一半短),直到分离成长度为 1 的 n 个数列(其实就是 n 个数)。
2、合并
将数列两两合并,每次合并时进行比较和排序,直到完成排序。
3、图片讲解
将一个无序数列排好序:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int n,a[12000],b[12000];
void merge(int low,int mid,int high)
{
int i=low,j=mid+1,k=low;
while (i<=mid && j<=high)
{
if (a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while (i<=mid)
b[k++]=a[i++];
while (j<=high)
b[k++]=a[j++];
for (int i=low;i<=high;i++)
a[i]=b[i];
}
void mergesort(int x,int y)
{
if (x>=y) return;
int mid=(x+y)/2;
mergesort(x,mid);
mergesort(mid+1,y);
merge(x,mid,y);
}
int main()
{
cin >>n;
for (int i=1;i<=n;i++)
cin >>a[i];
mergesort(1,n); //调用函数
for (int i=1;i<=n;i++)
cout <<a[i] <<" ";
return 0;
}