`
lfc_jack
  • 浏览: 145769 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

希尔排序

 
阅读更多
public class shellSort {


	public static void main(String[] args) {
		// 定义一个数组
		int[] shell = { 1, 4, 5, 7, 81, 23, 4, 46, 67, 98, 64, 33, 37, 99, 111,
				23, 3, 298 ,9,10,11,12,14,35};

		System.out.println("未排序的数组:\n");
		for (int m = 0; m < shell.length; m++) {
			System.out.print(shell[m] + "  ");
		}
		
		System.out.println("\n\n排序后:");
		// 调用下面的方法
		shellSort.sort(shell);
		for (int n = 0; n < shell.length; n++) {
			System.out.print(shell[n] + "  ");
		}

	}

	public static void sort(int[] shell) {
		int out, in, tmp;
		int len = shell.length;
		int h = 1;
		while (h < len / 3)
			// 计算间隔h最大值
			h = h * 3 + 1;

		while (h > 0) { // 能否继续通过缩小间隔h来分割数据列的判定
			/*
			 * out为什么从h开始?你分割后的第一子序列应该是这样一个序列,0, h, 2h, 3h, ...
			 * 插入排序的while循环是从1开始的
			 * ,因为第一个数始终有序,不需要比较,这个需要了解插入排序的算法,所以比较是从第二个数据线,就是数组的第h个下标开始
			 * out的判定为什么是out < len? 控制数组下标,下面的例子会说道
			 * 
			 * 下面举一个例子来解释 假定有一个10个数据项的数组,数组下标从0 ~ 9 表示 当h = 4时的子序列情况是这样的,以下标表示
			 * (0 4 8)(1 5 9)(2 6)(3 7)
			 * 我第一次是这么理解的,真对每一组分别进行插入排序(当然也可以这样实现,但是下标不好控制),但是对下面的代码来说这是错误的理解。
			 * 正确的过程是这样的,外层for循环每次对每一分组的前两个数据项进行插入排序,然后前3个,然后前4个 ... 这个和子序列个数有关
			 * 排序过程只真对方括号进行 当out = 4时进行如下过程 ([0 4] 8) 当out = 5时([1 5] 9) 当out =
			 * 6时([2 6]) 当out = 7时([3 7]) 当out = 8时([0 4 8]) 当out = 9时([1 5 9])
			 * h = 4执行完毕,然后h = (h - 1) / 3 = 1开始新的for循环 h = 1时执行过程和h =
			 * 4时一样,不过这时的子数列就是原始的数列,蜕变为一个简单的插入排序,这是数组基本有序,数据项移动次数会大大减少
			 */
			for (out = h; out < len; out++) { // 外层通过out确定每组插入排序的第二个数据项
				// 以下代码就是对子序列进行的插入排序算法
				tmp = shell[out];
				in = out;
				/*
				 * 比较插入排序while循环的写法,这里的while循环与h有关,所以判定就与h有关,包括 in -= h语句
				 * while(in > 0 && array[in - 1] > tmp){ array[in] = array[in -
				 * 1]; in--; } array[in] = tmp;
				 */
				while (in > h - 1 && shell[in - h] >= tmp) {
					shell[in] = shell[in - h];
					in -= h;
				}
				shell[in] = tmp;
				// for(int i = 0; i < len; i++)
				// System.out.print(array[i] + " ");
				// System.out.println();

			}

			// 缩小间隔
			h = (h - 1) / 3;
		}
	}
}


分享到:
评论

相关推荐

    希尔排序算法源代码

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的元素按照一定的间隔分组,对每组进行插入排序,然后逐渐减小间隔,直到间隔为1,此时整个序列视为...

    C语言_希尔排序希尔排序

    希尔排序(Shell Sort)是由Donald Shell在1959年提出的一种基于插入排序的改进算法。它的主要思想是通过设置一系列的增量序列,逐步减少这些增量,将待排序的元素进行分组,然后在每个小组内进行直接插入排序。这个...

    合并排序,插入排序,希尔排序,快速排序,冒泡排序,桶排序的C语言实现

    本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...

    数据结构之希尔排序算法程序

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后对每个子序列进行插入排序,最后再进行一次全局的插入...

    《快速排序 直接插入排序 堆排序 希尔排序 选择排序:五种排序》

    (1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...

    希尔排序法(希尔插入排序,希尔交换排序)

    ### 希尔排序法(希尔插入排序,希尔交换排序) #### 一、希尔排序法简介 希尔排序法是计算机科学领域中一种重要的排序算法,它由美国计算机科学家Donald Shell于1959年提出,因此得名希尔排序。希尔排序是一种...

    算法可视化系列——排序算法——希尔排序

    希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的间隔进行分组,然后对每组进行插入排序,随着间隔逐渐缩小,最后进行一次全排列,...

    内部排序 希尔排序和直接插入排序的比较

    ### 直接插入排序与希尔排序的比较 #### 一、概述 本篇文章将通过一组具体的数据集(8个整数)对直接插入排序(Direct Insertion Sort)和希尔排序(Shell Sort)这两种排序方法进行深入分析和比较。这两种排序...

    希尔排序java代码

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的增量分组,对每组使用直接插入排序,然后逐渐减小增量,继续进行分组排序,直到增量...

    数据结构 综合排序 冒泡排序 直接插入排序 快速排序 希尔排序等等

    根据提供的文件信息,我们可以深入探讨几种经典的排序算法:冒泡排序、直接插入排序、快速排序以及希尔排序。这些算法在数据结构与算法课程中是非常重要的基础内容,它们各自有着独特的特性和应用场景。 ### 1. ...

    c++ 7 种排序.快速排序, 归并排序,插入排序,选择排序,起泡排序,堆排序,希尔排序

    下面将详细讲解这7种排序算法:快速排序、归并排序、插入排序、选择排序、冒泡排序、堆排序以及希尔排序。 1. **快速排序**:由C.A.R. Hoare提出的,采用分治策略。基本思想是选取一个基准元素,通过一趟排序将待...

    希尔排序,冒泡排序,堆排序等各种排序算法

    本主题将详细探讨希尔排序、冒泡排序、堆排序等经典的排序算法,这些都是数据结构与算法学习中的核心内容,尤其对于北邮数据结构课程来说,理解并掌握这些排序方法至关重要。 1. **插入排序**: 插入排序是一种...

    基数排序、堆排序、希尔排序、直接插入排序

    这里我们将深入探讨四种常见的排序算法:基数排序、堆排序、希尔排序和直接插入排序。 首先,基数排序是一种非比较型整数排序算法,它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序...

    希尔排序C语言实现

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后对每个子序列进行插入排序,最后减小增量,重复这个...

    希尔排序(程序).txt

    ### 希尔排序原理与实现 #### 一、希尔排序简介 希尔排序(Shell Sort)是一种基于插入排序的高效算法。它通过将原始数组分割成多个子序列来进行排序,从而提高了插入排序的效率。希尔排序的核心思想是通过将相隔...

    7大排序算法实现程序(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)

    本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...

    数据结构——希尔排序

    希尔排序,又称希尔斯排序,是由美国计算机科学家Donald Shell于1959年提出的一种基于插入排序的快速排序算法。这种排序方法通过设置一个增量序列,将待排序数组分割成若干个子序列,然后对每个子序列进行插入排序。...

    希尔排序基本思想

    希尔排序是一种基于插入排序的快速排序算法,由Donald Shell在1959年提出。它的主要特点是通过将待排序的数组元素按照一定的间隔分组,然后对每组进行插入排序,随着间隔逐渐减小,直到间隔为1时,整个数组成为一个...

    希尔排序的代码

    ### 希尔排序算法详解 #### 算法概述 希尔排序(Shell Sort),又称为缩小增量排序,是插入排序的一种更高效的改进版本。它由Donald Shell在1959年提出。希尔排序的基本思想是:将待排序列分割成若干子序列分别...

    希尔排序(C语言程序)

    希尔排序是一种基于插入排序的快速排序算法,由Donald Shell在1959年提出。它通过设置一个间隔序列,将待排序的数组分为若干个子序列,然后对每个子序列进行插入排序,随着间隔序列逐渐减小,最终完成整个数组的排序...

Global site tag (gtag.js) - Google Analytics