排序算法2——(希尔、堆、归并)

一.希尔排序

希尔排序也被称为“缩小增量排序”,是一种效率更高的插入排序,步长为1时希尔排序就是插入排序。

原理:先将待排序的数组元素分成多个子序列(这些子序列是以相对步长为区分单位的,相隔步长相同的元素在同一个组中),使得每个子序列的元素个数相对较少,然后对各个子序列分别进行插入排序,待整个排序序列“基本有序后”,最后再对所有元素进行一次插入排序。

示例代码如下:

 1 public class shell {
 2     public static void shellSort(int array[]){
 3         int i,j,h,temp;
 4         int length = array.length;
 5         for(h=length/2;h>0;h=h/2){
 6             for(i=h;i<length;i++){
 7                 temp = array[i];
 8                 for(j=i-h;j>=0;j-=h){
 9                     if(temp<array[j])
10                         array[j+h] = array[j];
11                     else
12                         break;
13                 }
14                 array[j+h] = temp;
15             }
16         }
17     }
18
19
20     public static void main(String[] args){
21         int a[] = {5,4,9,8,7,6,0,1,3,2};
22         int len = a.length;
23         shellSort(a);
24         for(int i=0;i<len;i++){
25             System.out.println(a[i]+" ");
26         }
27     }
28 }

二.堆排序

堆是一种特殊的树形结构,每个节点都有一个值,通常提到堆都是指一个棵完全二叉树,根节点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。

原理:对于给定的n个记录,初始时把这些记录看作一棵顺序存储的二叉树,然后将其调整为一个大顶堆,然后将堆的最后一个元素与堆顶元素(即二叉树的根节点)进行交换后,堆的最后一个元素即为最大记录;接着将前(n-1)个元素程序调整为一个大顶堆,再将对顶元素与当前堆的最后一个元素进行交换后得到次大的记录,重复该过程直到调整的堆中只剩一个元素时为止,该元素即为最小记录,此时便可得到一个有序序列。

堆排序主要包括两个过程:一是构建堆,二是交换堆顶元素与最后一个元素的位置。

示例程序如下:

 1 public class heap {
 2     public static void HeapAdjust(int[] a,int pos,int len){
 3         int j,temp = a[pos];
 4         for(j=2*pos;j<=len;j*=2){
 5             if(j<len && a[j]<a[j+1])
 6                 ++j;
 7             if(temp>=a[j])
 8                 break;
 9             a[pos] = a[j];
10             pos = j;
11         }
12         a[pos] = temp;
13     }
14
15     public static void HeapSort(int a[]){
16         int length = a.length;
17         int i;
18         for(i=length/2;i>=0;i--)
19             HeapAdjust(a,i,length-1);
20         for(i=length-1;i>=0;i--){
21             int tem = a[0];
22             a[0] = a[i];
23             a[i] = tem;
24             HeapAdjust(a,0,i-1);
25         }
26     }
27
28     public static void main(String[] args){
29         int a[] = {5,4,9,8,7,6,0,1,3,2};
30         int len = a.length;
31         HeapSort(a);
32         for(int i=0;i<len;i++){
33             System.out.println(a[i]+" ");
34         }
35     }
36 }

三.归并排序

归并排序是利用递归与分治技术将数据序列划分成越来越小的半子表,再对半子表排序,最后再用递归方法将排序好的半子表合并成越来越大的有序序列。

原理:对于给定的n个记录,首先将每两个相邻长度为1的子序列进行归并,得到n/2个长度为2或1的有序子序列,再将其两两归并,反复执行此过程直到得到一个有序序列。

示例程序如下:

 1 public class merge {
 2     public static void Merge(int[] a,int p,int q,int r){
 3         int i,j,k,n1,n2;
 4         n1 = q-p+1;
 5         n2 = r-q;
 6         //创建并初始化左右数组
 7         int[] L = new int[n1];
 8         int[] R = new int[n2];
 9         for(i=0,k=p;i<n1;i++,k++)
10             L[i] = a[k];
11         for(j=0,k=q+1;j<n2;j++,k++)
12             R[j] = a[k];
13         //主要的排序工作
14         for(k=p,i=0,j=0;i<n1&&j<n2;k++){
15             if(L[i]<R[j]){
16                 a[k] = L[i];
17                 i++;
18             }
19             else{
20                 a[k] = R[j];
21                 j++;
22             }
23         }
24         //排序扫尾工作
25         if(i<n1){
26             for(j=i;j<n1;j++,k++)
27                 a[k] = L[j];
28         }
29         if(j<n2){
30             for(i=j;i<n2;i++,k++)
31                 a[k] =R[i];
32         }
33     }
34     public static void MergeSort(int[] a,int p,int r){
35         if(p<r){
36             int q = (p+r)/2;
37             MergeSort(a,p,q);
38             MergeSort(a,q+1,r);
39             Merge(a,p,q,r);
40         }
41     }
42
43     public static void main(String[] args){
44         int a[] = {5,4,9,8,7,6,0,1,3,2};
45         int len = a.length;
46         MergeSort(a,0,len-1);
47         for(int i=0;i<len;i++){
48             System.out.println(a[i]+" ");
49         }
50     }
51 }
时间: 2024-11-02 10:19:07

排序算法2——(希尔、堆、归并)的相关文章

排序算法之希尔、归并、堆和基数排序

//希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的 : 1. 插入排序在对几乎已经排好序的数据操作时,效率高,既可以达到线性排序的效率 2. 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位 希尔排序的基本思想是 : 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时, 再堆全体记录进行依次直接插入排序. 算法步骤 : 1:

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

经典排序算法之希尔排序

? 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.希尔排序适合数据量中等情况,几十个到几万个. ? 网上看了好久才彻底明白希尔排序是什么,简单的说将就是按照步进对数据进行分组,对每组分别进行插入排序,直到步进是1的时候则全部完成.在此感谢 dreamcatcher-cx的博客 的讲解. function sortShell(arr)

冒泡 选择 插入 希尔 堆 归并 快速 排序算法

排序相关概念 排序:对一序列对象根据某个关键字进行排序: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 排序耗时的操作:比较.移动: 排序分类: (1)交换类:冒泡排序.快速排序:此类的特点是通过不断的比较和交换进行排序: (2)插入类:简单插入排序.希尔排序:此类的特点是通过插入的

java排序算法之希尔排序

希尔排序是冲破二次时间屏障的第一批算法之一. 它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止.因此希尔排序也叫缩减增量排序. 希尔排序使用一个序列h1,h2,h3...hk来排序. 具体的意思是 第一趟排序比较的是相隔为hk的元素,也就是比较a[i]与a[i+hk],保证a[i]<=a[i+hk]. 第二次比较的是相隔为hk-1的元素,也就是比较a[i]与a[i+hk-1],保证a[i]<=a[i+hk-1]. 直到最后比较的是相

我的Java开发学习之旅------&gt;Java经典排序算法之希尔排序

一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名.Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔排序的中心思想就是:将数据进行分组,然后对每一组数据进行排序,在每一组数据都有序之后 ,就可以对所有的分组利用插入排序进行最后一次排序.这样可以显著减少交换的次数,以达到加快排序速度的目的.       希尔排序的中心思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离

Java学习笔记——排序算法之希尔排序(Shell Sort)

落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n2)的算法之一. 其基础是插入排序. 上代码: 1 public class ShellSort { 2 3 public static void shellSort(int[] arr){ 4 5 int increment = arr.length; 6 int temp;//牌 7 int i; 8

排序算法系列——希尔排序

希尔排序同之前介绍的直接插入排序一起属于插入排序的一种.希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本.它的作法不是每次一个元素挨一个元素的比较.而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置:然后增量缩小:最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率.希尔排序对增量序列的选择没有严格规定. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作

排序算法一希尔排序

希尔排序(Shell Sort) 插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 希尔排序是非稳定排序算法. 1 class ShallSort { 2 public void sort() { 3 int[] arr = {1,2,5,1,4,2,12}; 4 5 //增量 6 int flag = arr.length; 7 while (flag>1){ 8 //获取增量间隔,递减 9 flag=flag/3+1; 10 //交叉排序:所有组交叉一起排序 11

算法学习之排序算法:希尔排序

希尔排序又称"缩小增量排序",它的基本思想是:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对记录进行一次直接插入排序. 希尔排序的一个特点是:子序列的构成不是简单地"逐段分割",而是将相隔某个"增量"的记录组成一个子序列.这就使得希尔排序中关键字较小的记录不是一步一步地往前挪动,而是一次按照"增量"的大小跳跃式地往前移,从而使得在进行最后一趟增量为1的插入排