数据结构精要------直接插入排序和希尔排序算法

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法。

-----直接插入排序

package com.sort;

/**
 * 直接插入排序
 *
 * @author weixing-yang
 *
 * 算法思路:
 *  每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置,
 *  直到所有元素全部出入完成为止。
 */
public class InsertionSort {

	public void insertionSort(int[] arr, int n) {
		for (int i = 1; i < n - 1; i++) {
			int temp = arr[i];//取得第二个元素
			if (temp < arr[i - 1]) {
				int j;
				for (j = i-1; j >= 0 && arr[j] > temp; j--) {
					arr[j+1] = arr[j];
				}
				arr[j+1] = temp;
			}
		}
	}
}

----- 希尔排序

希尔排序(Shell Sort)是插入排序的一种,是将整个无序列分割成若干小的子序列分别进行插入排序。

package com.sort;

/**
 * 希尔排序
 * @author weixing-yang
 *
 *	算法思路
 *	先取出一个正整数d1<n,把所有序号相隔d1的元素分别放置一个组中,各组内进行直接插入排序。
 *  然后在取d2<d1,重复上述分组和排序操作。直至di =1,即所有记录放到一组中排序为止。
 *
 */
public class ShellSort {

	public void shellSort(int[] arr, int n){
		int i,j,k,temp;
		k = (n-1)/2;
		while(k > 0){
			for (i = k; i < n-1; i++) {
				temp = arr[i];
				for (j = i-k; j >= 0 && arr[j] > temp; j -= k) {
					arr[j+k] = arr[j];
				}
				arr[j+k] = temp;
			}
			k/=2;
		}
	}
}

-----测试函数

package com.sort;

public class Main {

	public static void main(String[] args){
		int[] array = {36, 25, 45,40, 12, 34, 55};
		int n = array.length;
		InsertionSort insert = new InsertionSort();
		ShellSort shell = new ShellSort();
		long start = System.currentTimeMillis();
		//insert.insertionSort(array, n);
		shell.shellSort(array, n);
		long end = System.currentTimeMillis();
		long sum = end - start;
		System.out.println("排序花费的总毫秒数:"+sum);
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i]+" ");
		}
	}
}

-----运行结果

排序花费的总毫秒数:0
12 25 34 36 40 45 55 

直接插入排序是稳定排序,时间复杂度是n2,希尔排序是不稳定排序。

@@------->>下篇继续实践归并排序的两种排序算法。

数据结构精要------直接插入排序和希尔排序算法,布布扣,bubuko.com

时间: 2024-10-12 18:44:00

数据结构精要------直接插入排序和希尔排序算法的相关文章

数据结构例程——插入排序之希尔排序

本文是[数据结构基础系列(9):排序]中第3课时[插入排序之希尔排序]的例程. 1.希尔排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定义 void

数据结构之插入排序与希尔排序

1.直接插入排序 直接插入排序是一种最简单的排序算法,它的基本操作是将一个记录插入到已经排序好的序列中,从而得到一个新的有序表.直接插入排序算法原理如下图所示: 直接插入排序算法如下: void InsertSort(int arr[],int length) { int key,j; for(int i=1;i<length;++i) { key=arr[i]; //记录标志; j=i-1; //循环比较并且交换相邻的两个数; while (j>=0&&arr[j]>k

【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的.     注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实

插入排序,希尔排序,堆排序,归并排序,快速排序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&

Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这

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

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

插入排序算法之直接插入排序和希尔排序

插入排序算法 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据. 直接插入排序 直接插入排序的排序思路是:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入. 例子: 有序列: 开始时,有序序列只有一个元素就是第一个元素(红色),后面的无序序列(绿色).接下来,取无序序列中

java排序之插入排序(直接插入排序和希尔排序)

上面一片博文探讨了关于的java选择排序(冒泡排序和快速排序)本章将继续探讨java排序之插入排序,插入排序分为直接插入排序和希尔排序两种. 1.直接插入排序思想:在需要排序的一组数据中假设前该数组的前n-1(n >= 2)个数是已经排好序的,现在要把第n个数插入到前面的n-1个数中,使得这n个数也是排好顺序的.如此反复进行,知道n等于需要排序的数组的长度时.就实现了该数组的直接插入排序. 代码如下: /** * * @param a 需要排序的数组 */ public static void

#排序算法#【2】直接插入排序、希尔排序

直接插入排序法 插入排序的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间. 核心代码: //直接插入排序法 void InsertSort(int a[],int n){ int i,j,k,t; for(i = 1 ; i<n;i++){ k = a[i]; /* 第一次比较粗糙的写法 j = i-1; while(