#include <stdio.h>
/**
* 希尔排序(优化)
* 平均时间复杂度:O(n^1.3)
* 平均空间复杂度:O(1)
* 稳定性:不稳定
* 思想理念:分组,进行每个gap都进行除以2,
* 这样大组分小,有利于数据的移动变小
**/
void shell_sort(int a[],int len){
for(int gap=len>>2;gap>0;gap/=2){
for(int i=gap;i<len;i++){
int j,tmp=a[i];
for(j=i;j>0&&tmp<a[j-gap];j-=gap){
a[j]=a[j-gap];
}
a[j]=tmp;
}
}
}
/**
* 插入排序(优化)
* 平均时间复杂度:O(n^2)
* 平均空间复杂度:O(1)
* 稳定性:稳定
* 思想理念:从前到后进行循环,从后到前循环,
* 如果前比后大,用一个下标记住,循环结束之后
* 进行交换
**/
void insertion_sort_update(int a[],int len){
for(int i=1;i<len;i++){
int j,tmp=a[i];
for(j=i;j>0&&tmp<a[j-1];j--){
a[j]=a[j-1];
}
a[j]=tmp;
}
}
/**
* 插入排序
* 平均时间复杂度:O(n^2)
* 平均空间复杂度:O(1)
* 稳定性:稳定
* 思想理念:从前到后进行循环,从后到前循环,
* 如果前比后大,那么交换
**/
void insertion_sort(int a[],int len){
for(int i=1;i<len;i++){
for(int j=i;j>0&&a[j]<a[j-1];j--){
int tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
}
}
}
/**
* 选择排序
* 平均时间复杂度:O(n^2)
* 平均空间复杂度:O(1)
* 思想理念:从前到后进行选择,选择最小
* 与最开始的数字进行交换
**/
void selection_sort(int a[],int len){
for(int i=0;i<len-1;i++){
int min_num=i;
for(int j=i+1;j<len;j++){
if(a[j]<a[min_num]) min_num=j;
}
int tmp=a[min_num];
a[min_num]=a[i];
a[i]=tmp;
}
}
/**
* 冒泡排序
* 平均时间复杂度:O(n^2)
* 平均空间复杂度:O(1)
* 思想理念:从后向前进行起泡,
* 每个泡泡能够使最大数字浮起来,
* 从而达到排序效果
**/
void bubble_sort(int a[],int len){
for(int i=len-1;i>=0;i--){
for(int j=1;j<=i;j++){
if(a[j]<a[j-1]){
int tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
}
}
}
}
int main()
{
int a[]={5,1,4,7,8,6,2};
shell_sort(a,sizeof(a)/sizeof(int));
for(int i=0;i<sizeof(a)/sizeof(int);i++) printf("%d ",a[i]);
system("pause");
return 0;
}