1插入排序
每次把无序序列的一个元素插入到有序序列中,{3,2,1,9,4}->{2,3,1,9,4}->{1,2,3,9,4}->{1,2,3,9,4}->{1,2,3,4,9}
void insertsort(int a[],int n){
int temp,i,j;
for(i=0;i<n;i++){
temp=a[i];//每次判断temp
j=i-1;
while(j>=0&&a[j]>temp){//大于temp后移一个位置
a[j+1]=a[j];
j--;
}
a[j+1]=temp;//插入
}
}
2选择排序
每次遍历无序序列找到最小的那个值移到最前面
void selectsort(int a[],int n){
int i,j,k;
int temp;
for(int i=0;i<n;i++){
k=i;//k来存储最小值位置,a[k]为最小值
for(int j=i+1;j<n;j++){
if(a[k]>a[j]) k=j;//找到最小值
temp=a[i];//交换a[i]和a[k]
a[i]=a[k];
a[k=temp];
}
}
}
3冒泡排序
void popsort(int a[],int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<=n-1-i;j++){
if(a[j]<a[j-1]){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
}
4希尔排序
取增量k,比较a[i]和a[i+k],变增量,再比较,最后一步增量为1
void shellsort(int a[],int n){
int temp;
for(int gap=n/2;gap>0;gap/=2){//第一个增量n/2,每次/2作为下一个增量
for(int i=gap;i<n;i++){
temp=a[i];
int j;
for(j=i;j>=gap&&a[j-gap]>temp;j-=gap){//每次i都要与前面的i-整数个gap比较
a[j]=a[j-gap];//大则后移
}
a[j]=temp;//插入
}
}
}
5快速排序
选取一个轴值,先和第一个值交换位置,开始比较,每一趟都找到一个值的正确位置
手写划分:
int Partition(int L[], int s, int t) {
int temp = L[s];
int low = s, high = t;
while (low < high) {
while (L[high] > temp)
high--;
L[low] = L[high];
while (L[low] < temp)
low++;
L[high] = L[low];
}
L[low] = temp;
return low;
}
int QSort(int L[], int s, int t) {
if (s >= t)
return 0;
int k = Partition(L, s, t);
QSort(L, s, k - 1);
QSort(L, k + 1, t);
return 0;
}
int QuickSort(int L[], int n) {
return QSort(L, 0, n - 1);
}
6堆排序
大根堆(节点>孩子)小根堆(节点<孩子),若不是,则调整(从n/2向下取整-1的节点开始调整)
插入:插入的节点加到最后,重新调整堆
删除:最后一个节点值移到删除节点的位置,重新调整
有序序列:拿出堆顶值,重新调整往复
7归并排序
void mergesort(int a[],int low,int high){
int mid=(low+high)/2;
if(low<high){
mergesort(a,low,mid);
mergesort(a,mid+1,high);
merge(a,low,mid,high);
}
}
void merge(int a[],int low,int mid,int high){//low到mid和mid+1到high两个有序表合并
int i,j,k=low;
int *b=new int[high-low+1];
for(k=low;k<=high;k++){
b[k]=a[k];
}
k=low;
for(i=low,j=mid+1;i<=mid&&j<=high;k++){
if(b[i]<=b[j]){
a[k]=b[i++];
}
else a[k]=b[j++];
}
while(i<=mid){
a[k++]=b[i++];
}
while(j<=high){
a[k++]=b[j++];
}
}