欢迎来到天天文库
浏览记录
ID:14350141
大小:212.07 KB
页数:27页
时间:2018-07-28
《白话经典算法系列(冒泡、直接插入、希尔排序、直接选择、归并排序、快速排序、堆与堆排序)-----标题要长》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、白话经典算法系列(转载)原文作者:MoreWindows目录白话经典算法系列(转载)1白话经典算法系列之一冒泡排序的三种实现2白话经典算法系列之二直接插入排序的三种实现4白话经典算法系列之三希尔排序的实现6白话经典算法系列之四直接选择排序及交换二个数据的正确实现9白话经典算法系列之五归并排序的实现11白话经典算法系列之六快速排序快速搞定15白话经典算法系列之七堆与堆排序19二叉堆的定义19堆的存储19堆的操作——插入删除20堆的插入21堆的删除21堆化数组22堆排序24转载请标明出处,原文地址:http://www.cnblogs.com/more
2、windows/archive/2011/08/22/2149612.html24白话经典算法系列之一冒泡排序的三种实现冒泡排序是非常容易理解和实现,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。按照定义很容易写出代码://冒泡排序1voidBubbleSort1(inta[],intn){inti,j;for(i=0;i3、++)for(j=1;ja[j])Swap(a[j-1],a[j]);}下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。//冒泡排序2voidBubbleSort2(inta[],intn){intj,k;boolflag;k=n;flag=true;while(flag){flag=false;for(j=1;ja[j]){Swap(a[j-1],a[j]);flag=true;}k--;}}4、再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。//冒泡排序3voidBubbleSort3(inta[],intn){intj,k;intflag;flag=n;while(flag>0){k=flag;flag=0;for(j=1;ja[j]){Swap(a[j-1],a[j]);flag=j;}}}冒泡排序毕竟5、是一种效率低下的排序方法,在数据规模很小时,可以采用。数据规模比较大时,最好用其它排序方法。白话经典算法系列之二直接插入排序的三种实现直接插入排序(InsertionSort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。1.初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12.将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3.i++并重复第二步直到i==n-1。排序完成。下面给出严格按照定义书写的代码(由6、小到大排序):voidInsertsort1(inta[],intn){inti,j,k;for(i=1;i=0;j--)if(a[j]j;k--)a[k+1]=a[k];//将a[i]放到正确位置上a[k+1]=temp;}}}这样的代码太长了,不够清晰。现在进行一下改写,将搜索和数据后移这7、二个步骤合并。即每次a[i]先和前面一个数据a[i-1]比较,如果a[i]>a[i-1]说明a[0…i]也是有序的,无须调整。否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]=0&&a[j]>temp;j--)a[j+1]=a[j];a[j+1]=temp;}}再对将8、a[j]插入到前面a[0…j-1]的有序区间所用的方法进行改写,用数据交换代替数据后移。如果a[j]前一个数据a[j-1]
3、++)for(j=1;ja[j])Swap(a[j-1],a[j]);}下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。//冒泡排序2voidBubbleSort2(inta[],intn){intj,k;boolflag;k=n;flag=true;while(flag){flag=false;for(j=1;ja[j]){Swap(a[j-1],a[j]);flag=true;}k--;}}
4、再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。//冒泡排序3voidBubbleSort3(inta[],intn){intj,k;intflag;flag=n;while(flag>0){k=flag;flag=0;for(j=1;ja[j]){Swap(a[j-1],a[j]);flag=j;}}}冒泡排序毕竟
5、是一种效率低下的排序方法,在数据规模很小时,可以采用。数据规模比较大时,最好用其它排序方法。白话经典算法系列之二直接插入排序的三种实现直接插入排序(InsertionSort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。1.初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12.将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3.i++并重复第二步直到i==n-1。排序完成。下面给出严格按照定义书写的代码(由
6、小到大排序):voidInsertsort1(inta[],intn){inti,j,k;for(i=1;i=0;j--)if(a[j]j;k--)a[k+1]=a[k];//将a[i]放到正确位置上a[k+1]=temp;}}}这样的代码太长了,不够清晰。现在进行一下改写,将搜索和数据后移这
7、二个步骤合并。即每次a[i]先和前面一个数据a[i-1]比较,如果a[i]>a[i-1]说明a[0…i]也是有序的,无须调整。否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]=0&&a[j]>temp;j--)a[j+1]=a[j];a[j+1]=temp;}}再对将
8、a[j]插入到前面a[0…j-1]的有序区间所用的方法进行改写,用数据交换代替数据后移。如果a[j]前一个数据a[j-1]
此文档下载收益归作者所有