插入排序(直接插入排序、希尔排序)
声明:图片及内容基于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;
}
希尔排序
基本思想
关键问题
直接排序和希尔排序的比较
希尔排序算法的时间性能