十大排序算法—二分法插入排序

Posted 算法零基础学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十大排序算法—二分法插入排序相关的知识,希望对你有一定的参考价值。

二分法插入排序的思想很简单,我们往往可以通过“见文思意”,第一点:二分法。第二点:插入。那么二分法的是怎么实现的呢?

其实很简单,首先在已经排好序的元素里面找一个位置处在中间的元素,待插入的元素和这个元素进行比较,如果这个元素大于中间这个元素,那就取二分之后的大于中间这个元素的那一半,在进行二分,直到找到一个合适的位置。那么你可能要问了什么位置是合适的位置呢? 那就是找到最后没法再分的时候呗!

举例说明:

下面是实现的代码:

C:

void Binsort(int *a){

int i,j,left,right,temp,mid;

for(i=1;i<10;i++){

temp=a[i];

left=0;

right=i-1;

while(left<=right){

mid=(left+right)/2;  

if(temp<a[mid]) right=mid-1; 

   else   left=mid+1;

}

for(j = i-1;j>=left;j--)  a[j+1]=a[j]; 

if(left!=i) a[left]=temp; 

}

}

二分插入排序的平均时间复杂度是:O(n^2)

空间复杂度:S(n)=O(1);

下面是一个整成的C程序你可以用来选择使用前面的冒泡排序或者是二分插入排序对数组进行排序:


#include<stdio.h>

void Binsort(int *a,int num);

void maopao(int *a,int num);

int main(){

printf("你要输入多少个数字?\n");

int num=1;

scanf("%d",&num); 

int a[num],m;

printf("开始你的输入:\n"); 

for(m=0;m<num;m++){

scanf("%d",&a[m]);

}

printf("你输入的元素序列是: \n");

for(m=0;m<num;m++){

printf("%d ",a[m]);

printf("\n");

printf("请输入你要是用那种排序方法:1(冒泡排序)2(二分法插入排序):\n");

int chance;

scanf("%d",&chance);

switch(chance){

case 1:

maopao(a,num);

break;

case 2:

Binsort(a,num);

break;

default:

printf("你输入有误!\n");

printf("输出结果:\n");

for(m=0;m<num;m++){

printf("%d ",a[m]);

}

return 0;

}

void maopao(int *a,int num){

   int i,j,temp;

for(i=0;i<num-1;i++){

for(j=0;j<num-1-i;j++){

if(a[j]>a[j+1]){

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

}

}

void Binsort(int *a,int num){

int i,j,left,right,temp,mid;

for(i=1;i<num;i++){

temp=a[i];

left=0;

right=i-1;

while(left<=right){

mid=(left+right)/2;  

if(temp<a[mid]) right=mid-1; 

   else   left=mid+1;

}

for(j = i-1;j>=left;j--)  a[j+1]=a[j]; 

if(left!=i) a[left]=temp; 

}

}



以上是关于十大排序算法—二分法插入排序的主要内容,如果未能解决你的问题,请参考以下文章

十大经典排序算法总结(插入排序)

十大经典排序之:插入排序 |希尔排序

经典十大排序算法之8种内部常见排序算法

#yyds干货盘点#十大经典排序之:插入排序 |希尔排序

十大经典排序之冒泡,选择,插入排序

十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数-1