希尔排序与堆排序(Java版)

希尔排序

package ShellSort;

import Utils.SortUtils;

public class Demo {

    public static void shellSort(int[] a){

        int temp,j;
        int increment = a.length;

        do{
            increment = increment/3+1;//如果是直接插入排序,这里的increment都为1。
            //System.out.println(increment);
            for (int i = increment; i < a.length; i++) {
                if(a[i]<a[i-increment]){
                    temp = a[i];//暂存于temp中

                    for (j=i-increment; j>=0 && a[j]>temp; j-=increment) {
                        a[j+increment] = a[j];//记录后移,查找插入位置
                    }
                    a[j+increment] = temp;//插入
                }
            }
        }while(increment>1);
    }

    public static void main(String[] args) {
        int[] a = {2,3,5,4,1,6,9,8,7};
        shellSort(a);
        SortUtils.printString(a);
    }
}

复杂度分析

堆排序

package HeapSort;

import Utils.SortUtils;

public class Demo02 {

    //堆排序
    public static void heapSort(int[] a){
        int len = a.length;
        //将待排序数据构建为大顶堆
        for(int i=(a.length-1-1)/2;i>=0;i--){
            heapAdjust(a,i,len);
        }

        for (int i = a.length-1; i > 0; i--){
            //将队顶值与当前未经排序子序列的最后一个值交换
            SortUtils.swap(a,0,i);
            heapAdjust(a,0,--len);//重新调整大顶堆
        }

    }

    //将待排序序列构建成一个大顶堆
    public static void heapAdjust(int[] a,int s,int len){

        int temp;
        temp = a[s];
        for (int i = 2*s+1; i < len; i++) {
            if(i<len-1 && a[i]<a[i+1]){
                i++;//i为关键字中较大的记录的下标
            }

            if(temp>=a[i]){//如果父节点本身就大于最大的子节点,终止循环
                break;
            }
            a[s] = a[i];
            s = i;
        }
        a[s] = temp;
    }

    public static void main(String[] args) {
        int[] a = {2,3,5,4,1,6,9,8,7};
        heapSort(a);
        SortUtils.printString(a);
    }
}

复杂度分析

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 19:53:09

希尔排序与堆排序(Java版)的相关文章

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

参看:数据结构与算法分析-c语言描述 public class Main { public static void main(String[] args) { String[] a = { "a", "d", "e", "f", "m" }; String[] b = { "a", "h", "g", "l", "z&

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

插入排序,希尔排序,堆排序详解

本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序数组:1,3,5,6,7   现在待插入数据为2,那么他将会和7,6,5,3,依次作比较,当带插入数据小于有序数组最后的元素大小,则将该元素后移,直到待插入元素找到合适位置为止. 代码实现 void InsertSort(int* a, int size) 02 { 03     assert(a)

插入排序,希尔排序,堆排序

本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序数组:1,3,5,6,7   现在待插入数据为2,那么他将会和7,6,5,3,依次作比较,当带插入数据小于有序数组最后的元素大小,则将该元素后移,直到待插入元素找到合适位置为止. 代码实现 void InsertSort(int* a, int size) { assert(a); for (int

经典排序算法(Java版)

经典排序算法(Java版)  转载 1.冒泡排序 Bubble Sort最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡”序列处理若干遍.所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确.如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置.显然,处理一遍之后,“最轻”的元素就浮到了最高位置:处理二遍之后,“次轻”的元素就浮到了次高位

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

各种常见的排序 要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度! #include <iostream> using namespace std; // 冒泡 void BubbleSort(int data[], int length) { if(data == NULL || length <= 0)

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数

希尔排序和堆排序

下文外链接中,来自 希尔排序 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 其实所谓的增量就是从第一个数字开始之后加上增量互相比较. 比如增量为5时,第一个和第六个比较,第二个和第七个比较,然后得出的排序再次比较.增量为3时,第一个和第四个和第七个比较,然后得出排序比较.增量为1时,对数列简单微调,无需要大量移动操作即可完成整个数组的排序. ? 上面图学习链接. 例如:设待排序序列为{10,18,4,3,6,12,1,9,15,8}请给出用希

冒泡排序,快速排序,归并排序,插入排序,希尔排序,堆排序,计数排序,桶排序,基数排序

选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法. 选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是