插入排序(直接插入排序、希尔排序)

声明:图片及内容基于https://www.bilibili.com/video/BV1ez4y1Z7Ch?from=articleDetail

排序概述

 

插入排序

基本思想

 

 

关键问题

 

核心代码

#include<iostream>
using namespace std;
void insertSort(int r[],int n){
    int i,j;
    for(int i=2;i<=n;i++){
        r[0]=r[i];              //r[0]是监视哨 
        j=i-1;
        while(r[0]<r[j]&&j>=1){ //j从i前起始直到第一个元素 
            r[j+1]=r[j];
            j--;
        }
        r[j+1]=r[0];            //把r[0]记录的值赋值回去 
         
    }
}
int main(){
    int array[6]={0,4,3,2,1,9};
    int length=sizeof(array)/sizeof(array[0])-1;
    insertSort(array,length);
    for(int i=1;i<=length;i++){
        cout<<array[i]<<" ";
    }
    return 0;
}

性能分析

 

 

 

 

改进

#include<iostream>
using namespace std;
int binarySearch(int r[],int i){
    int begin=1;
    int end=i-1;
    int mid;
    while(begin<=end){
        mid=(begin+end)/2;
        if(r[mid]==r[i]) return mid;
        if(r[mid]>r[i]) end=mid-1;
        if(r[mid]<r[i]) begin=mid+1;
    }
    return mid;
}
void insertSort(int a[],int len){
 int key, left, right, middle;   
    for (int i=2; i<=len; i++)   
    {   
        key = a[i];   
        left = 0;   
        right = i-1;   
        while (left<=right)   
        {   
            middle = (left+right)/2;   
            if (a[middle]>key)   
                right = middle-1;   
            else   
                left = middle+1;   
        }   
        for(int j=i-1; j>=left; j--)   
        {   
            a[j+1] = a[j];   
        }   
        a[left] = key;          
    }   
}
int main(){
    int array[7]={0,4,3,2,1,8,7};
    int length=sizeof(array)/sizeof(array[0])-1;
    insertSort(array,length);
    for(int i=1;i<=length;i++){
        cout<<array[i]<<" ";
    }
    return 0;
}

希尔排序

基本思想

 

 

 

 

 

 

 

 

 

关键问题

 

 

 

 

 

 

直接排序和希尔排序的比较

希尔排序算法的时间性能

 

posted @ 2021-04-28 10:35  gonghr  阅读(108)  评论(0编辑  收藏  举报