数据结构(复习排序算法)——选泡插(选择,冒泡,插入,希尔)

#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;
}

猜你喜欢

转载自www.cnblogs.com/littlepage/p/11444482.html