1.直接插入排序 分析:a[n]有n个元素 a[0...n-1]  从 i=1...n-1  a[i]依次与   a[0...n-2]数字进行比较 发现后面的数字大于前面的数字交换位置,每一次比较,与前面的数字x比较,小于等于x的话往前推a[j]=a[j+1],当大于a[j]时候 a[j+1]=a[i]插入 //插入排序 #include<iostream> using namespace std; void gcd(int a[],int start,int end){ int tmp; i…
二分插入排序也称折半插入排序,基本思想是:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 01 void  BinaryInsertSort(int *pArray, int len) 02 { 03   //刚开始设有序序列只有一个元素 pA…
直接插入排序(顺序插入排序) 基本思想: 排序过程,整个排序过程为n-1趟插入,即先将序列中的第1个元素看成是一个有序子序列,然后从第2个元素开始,逐个进行插入,直至整个序列有序. 在有序序列中插入一个元素,保持序列是有序的,不断增长这个有序序列完成排序 就类似将成绩单上的第一个同学的名字和成绩学到旁边一张白纸中央,如果第二个同学比他成绩高,就写到第一个同学的上方,如果比他低,就写到下方.等看到第三个同学的成绩后,根据他的成绩与前两个同学成绩比较,插入到相应的位置.比如他的成绩正好在两个同学之间…
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有序数组从小到大为array[0],array[1],array[2],....,array[n-2],array[n-1],那么将待排数值array[n]与前面的有序数组从后向前依次比较,直到在有序数组中找到小于待排数值array[n]的位置,将array[n]插入到此位置,并入组合成新的有序数组.…
由于考试耽搁了几天,不好意思~~~ 前面的介绍的三种排序算法,都属于简单排序,大家能够看下详细算法,时间复杂度基本都在0(n^2),这样呢,非常多计算机界.数学界的牛人就非常不爽了,他们在家里想啊想,吃饭的时候在想,窝粑粑的时候也在想,到底能不能把时间复杂度搞低点呢.最终,皇天不负有心人啊,王母娘娘显灵了,最终被DL. SHELL这哥们给想出来了.他所创造的希尔(shell)排序是世界上第一个打破0(n^2)的时间复杂度的算法.牛逼不? 好了,言归正传. 希尔排序: 希尔排序,也称递减增量排序算…
希尔排序是对插入排序的优化,将插入排序的交换步长由1增加到h. 希尔排序的思想是使数组中任意间隔为h的元素有序.步长调幅为h = 3*h + 1, 也就是1,4,13,40,121,364, 1003....这种步长算法是经过论文证明为比较高效的步长. 最开始由最大步长开始排序,最大步长为 while(h < n/3) h = 3*h +1 步长最大时,比较的元素非常少,速度很快 后来步长逐渐缩短,比较的元素越来越多,但是此时元素的有序性也变好了,排序速度还是会很快. while(h>=1){…
基本思想: 希尔排序就是对直接插入排序的一个优化.现在有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length).先从array[0]开始,以incrementNum为增量的进行直接插入排序,直到数组末尾,然后从array[1]开始重复:以incrementNum为增量的进行直接插入排序; 然后从array[1]开始重复......一直到array[n].然后取一个小于上一步增量的新的增量(比如设置为incrementNum/2…
首先我们先介绍一下普通的插排,就是我们现在一般写的那种,效率是O(n^2)的. 普通的插排基于的思想就是找位置,然后插入进去,其他在它后面的元素全部后移,下面是普通插排的代码: #include<iostream> #include<fstream> #include<stdio.h> using namespace std; ]; ]; int main(){ ios::sync_with_stdio(false); int n; cin>>n; ;i&l…
4-7 ShellSort.c #include <stdio.h> #include "4-1 CreateData.c" //生成随机数的函数 #define ARRAYLEN 10 //需要排序的数据元素数量 void ShellSort(int a[],int n)//希尔排序 { int d,i,j,x; d=n/; ) //循环至增量为1时结束 { for(i=d;i<n;i++) { x=a[i]; //获取序列中的下一个数据 j=i-d; //序列中前…
因为“野味肺炎”的肆虐,过年被迫宅家只能吃了睡.睡了吃.这么下次只能长膘脑子空空,不如趁此机会重新学习java基础,为日后做铺垫~ 循环结构: 几种循环:for(::),while(){},do{}while() switch的break,如果不加,会从当前匹配的开始输出一直到最后输出的 break 用在for 也能跳出循环,只能终止当前所在的for循环 continue 结束当前这次循环 return 跟break一样可以终止循环,但是return是结束整个方法,不管有多少层循环 break和…