【数据结构十八】插入排序、希尔排序、冒泡排序算法

43 阅读2分钟

排序

  • 概念
    • 分类:

图片.png

  • 总结:

图片.png

插入排序:

  • 算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成
  • 第一种:
//直接插入排序
void InsertSort(int A[], int n){
    int i, j, temp;
    for(i =1; i< n; i++){ //将各元素插入已排好序的序列中
        if(A[i] < A[i-1]){ //若A[i]关键字小于前驱
            temp=A[i]; //用temp暂存A[i]
            for(j=i-1;j>=0 && A[j] > temp;--j)
                //检查前面所有已排好序的元素
                A[j+1] = A[j];//所有大于temp的元素都往后挪位
            A[j+1] = temp; //复制到插入位置
        }
 } 

  • 第二种

图片.png

  • 算法效率分析:

    • 空间复杂度: O(1)
    • 最好时间复杂度(全部有序): O(n)
    • 最坏时间复杂度(全部逆序):O(n方)
    • 平均时间复杂度:O(n方)
    • 算法稳定性稳定
  • 优化:

图片.png

  • 总结:

图片.png

希尔排序

  • 概念:
    • 先追求表中元素部分有序,在逐渐逼近全局有序

图片.png

  • 代码:

图片.png

  • 总结

图片.png

冒泡排序

  • 概念:

    • 从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i],则交换它们,直到序列比较完
  • 代码:

//交换
void swap(int &a, int &b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}
//冒泡排序(从后往前)
void BubbleSort(int A[], int n){
    for(int i = 0; i< n-1; i++){
       bool flag = false; //表示本躺冒泡是否发生交换的标记(优化)
       for(int j = n-1; j > i; j--){//一趟冒泡过程
           if(A[j-1]>A[j]){
               swap(A[j-1],A[j]); //交换
               flag = true;
            }
        }
        if(flag == false)
            return; //本躺遍历后没有发生交换,说明表已经有序
     }
}

  • 空间复杂度O(1)

  • 最好时间复杂度O(n)

  • 最坏时间复杂度O(n方)

  • 平均时间复杂度O(n方)

  • 算法稳定性稳定

  • 总结:

图片.png