排序分为内部排序和外部排序
内部排序:不借助其他内存直接进行数组内的排序
外部排序: 借助其外存储器进行排序
内部排序又有:插入排序(直接插入,希尔排序)、快速排序、归并排序、基数排序,选择排序(简单,树形选择排序,堆排序)
一、快排
先写函数实现:
#include<iostream>
using namespcae std;
int Partition(int* a, int l, int h){
int tmp = arr[l];
while(l<h){
while(l < h && a[h] >= tmp) --h;
a[l] = a[h]; //第一次划分将高位小于标志位的数填到标志位(填坑)
while(l < h && a[l] <= tmp) ++l;
a[h] = a[l]; //第一次填坑后高位有一个坑,将低位大于标志位的数填到高位(又有低位坑
//出现)
}
a[l] = tmp;
return l;
}
void Qsort(int* a, int l, int h){
if(l<h){
int flag = Partition(a,l,h);
Qsort(a,l,flag-1);
Qsort(a,flag+1,h);
}
}
上面使用递归算法,一个属于划分过程函数,最后返回标志位下标,然后递归标志位的左右继续划分,直到l=h
二、直接插入排序(了解)
每次将一个数向前插入,找到第一个比key小的数插入到后面,依次进行。
直到gap=1时,因为有序性变好,用直接插入效率会很高,所以直接用直接插入进行排序。
三、希尔排序
将每个数与相隔gap的数作为一组数字先进行排序,然后缩小gap进行下一趟排序。
三、选择排序
1.简单选择排序
2.树形选择排序
3.堆排序
四、归并排序
将两个或者两个以上的有序表合并成一个新的有序表
void merge(int a1[], int sum[], int s, int M, int N){
int i = s, j = M+1, k = s;
while(i <= M && j <= N){
if(a1[i] < a1[j]) sum[k++] = a1[i++];
else sum[k++] = a1[j++];
}
while(i<=M)sum[k++] = a1[i++];
while(j<=N) sum[k++] = a1[j++];
}