数据结构(复习排序算法)——选泡插(选择,冒泡,插入,希尔)
#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; }