C++二分插入排序
2015-10-31 22:50
267 查看
经过上几篇对排序算法的了解,我们发现,所谓的排序也就是确定一个数组中每个元素的位置,然后对号入座,其过程也就是找到该元素的位置。确定位置,使用二分法可以达到很高的效率,我们将他应用到插入排序中就算是对上篇中排序的一种优化,能提高效率。
____________________________________________________________________________________________________
C++例子:只用C++演示
_____________________________________________________________________________________________________________________________________________________________________
其实关于二分法排序,我查阅资料的时候代码中并没有 if(array[0]<temp&&array[i-1]>temp) ,if(array[0]>=temp),if(array[i-1]<=temp) 这样的判断语句,这是我自己加上的,因为如果没有这些判断语句的话,当让你排序的数列已经是有序数列的时候程序还是会经历一些不必要的循环,反倒不如上一篇中的直接插入排序了。
以上代码中有什么需要改进修改的的欢迎留言^_^
____________________________________________________________________________________________________
基本思想:
与上篇中的插入排序类似分已排序和未排序部分,然后将未排序 部分元素逐个插入,但是插入的过程不同,需要每次求一个 中间位置,和中间位置元素比较大小,然后根据大小情况,将高位 左移或者将低位右移,再求中间元素比较,直到找到合适位置 (也就是说使用二分法确定插入位置)后 将其部分元素后移为待插入元素腾出空间,再插入该序列即可。C++例子:只用C++演示
#include<iostream> using namespace std; void HalfSort(int *array,int Length) {//定义最低,最高,中间值,待插入数据,插入位置 int low,high,middle,temp,index,i,j; for(i=1;i<Length;i++) //控制插入的元素,第一次从下标为1的元素开始 { //,将前面array[0]的当成已经排好序的数列,然后逐个插入 low=0; high=i-1; temp=array[i]; index=i; if(array[0]<temp&&array[i-1]>temp) //与头尾相比较如果没在范围类省略循环 { while(low<=high) //二分法查找插入位置 { middle=(low+high)/2; if(array[middle]>temp) { high=middle-1; } else low=middle+1; } //最后确定位置index index=low; } if(array[0]>=temp) //如果比第一个元素还小就直接插到第一个位置 { index=0;} if(array[i-1]<=temp) //如果比最后一个元素还大直接插到最后一个位置 { index=i;} //向后移位腾出插入空间 for(j=i-1;j>=index;j--) { array[j+1]=array[j];} array[index]=temp; //插入 } //输出 for(i=0;i<Length;i++) { cout<<array[i] <<" "; } cout<<endl; } void main() { int array[]={63,4,24,1,3,15}; int Length=sizeof(array)/sizeof(array[0]);//计算长度 HalfSort(array,Length); }
_____________________________________________________________________________________________________________________________________________________________________
其实关于二分法排序,我查阅资料的时候代码中并没有 if(array[0]<temp&&array[i-1]>temp) ,if(array[0]>=temp),if(array[i-1]<=temp) 这样的判断语句,这是我自己加上的,因为如果没有这些判断语句的话,当让你排序的数列已经是有序数列的时候程序还是会经历一些不必要的循环,反倒不如上一篇中的直接插入排序了。
以上代码中有什么需要改进修改的的欢迎留言^_^
相关文章推荐
- Windows实用系统工具类--C++
- 【LeetCode从零单刷】Combinations & Combination Sum 系列
- c++11 其他特性(一)
- 高质量程序设计指南C++/c语言 第二章
- C++ const 和指针类型
- 大数自增
- C++实现单链表
- C++实现单链表
- 递归输出char数组的所有排列
- c语言之动态栈的功能实现
- printf()问题
- 《C++ primer》英文第五版阅读笔记(五)——const
- 深入理解C++中的mutable关键字
- POJ_1781_In Danger_约瑟夫问题
- C++学习笔记20——顺序容器的操作
- Hanoi Tower
- c语言const和c++的const的区别
- 《C++ primer》英文第五版阅读笔记(四)——复合类型
- 求1到n中取几个数使和为m
- 操作系统实验一进程管理