排序之插入排序:直接插入和希尔排序

一、插入排序

1、思想:原理类似抓扑克牌,在有序表中进行插入和查找,插入合适的位置时,之后的元素需要往后移动

2、时间复杂度:

最好:O(N),正序情况,只有比较时间,无移动时间

最坏:O(N2),逆序情况

平均:O(N2)

3、辅助空间:O(1)

4、稳定性:稳定

5、适用场合:适用于初始序列基本有序的情况,或者n小的时候,插入排序效率高

 1     public static void insertSort(int[] a) {
 2         int target,i,j;
 3         for(j = 1;j<a.length;j++) {//当前带插入的元素下标
 4             target = a[j];
 5             while(j>0&&target < a[j-1]) {
 6                 a[j] = a[j-1];//向后移动
 7                 j--;
 8             }
 9             a[j] = target;
10         }
11     }
12         

二、希尔排序

1、思想:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个记录基本有序时,再对整个记录进行一趟插入排序,步长最后必减少为1

2、时间复杂度:

最好:O(N1.3)

最坏:O(N2)

平均:根据步长不同

3、辅助空间:O(1)

4、稳定性:不稳定,插入排序本身稳定,但是由于有步长,所以不稳定

5、适用场合:关键字较小的记录就不是一步一步地向前挪动,而是跳跃式地往前移,从而使得进行最后一趟排序时,整个序列已经做到基本有序,只要作记录的少量比较和移动即可。因此希尔排序的效率要比直接插入排序高。

public static void shellSort(int[] a) {
        int i,j,r,temp;
        for(r = a.length/2;r >= 1;r = r/2) { //r为步长
            for(i = r;i < a.length;i++) {
                temp = a[i];
                j = i - r;
                while(j >= 0 && temp < a[j]) {
                    a[j+r] = a[j];
                    j-= r;
                }
                a[j+r] = temp;
            }
        }
    }

原文地址:https://www.cnblogs.com/lizijiangmm/p/8645423.html

时间: 2024-10-16 10:51:14

排序之插入排序:直接插入和希尔排序的相关文章

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

排序算法(六)——希尔排序

基本思想 希尔排序是基于插入排序的,又叫缩小增量排序. 在插入排序中,标记符左边的元素是有序的,右边的是没有排过序的,这个算法取出标记符所指向的数据,存入一个临时变量,接着,在左边有序的数组中找到临时变量应该插入的位置,然后将插入位置之后的元素依次后移一位,最后插入临时变量中的数据. 试想,假如有一个很小的数据项在靠近右端的位置上,把这个数据项插入到有序数组中时,将会有大量的中间数据项需要右移一位,这个步骤对每一个数据项都执行了将近N次复制.虽然不是所有数据项都必须移动N个位置,但是,数据项平均

排序算法: 插入排序法(直接插入法和希尔排序法)

1, 直接插入法:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.由于碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面.所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的. 实现思路: 1,把第一个数看成有序序列,从数组第二个开始向后遍历,即i=1,外层循环标识并决定待比较的数值,内层循环为待比较数值确定其最终位置; 2,当从第i个数向前遍历时,将a[i]保存在temp中,然后令j=i,首先temp与

插入排序算法之希尔排序

一.前沿: 希尔排序(Shell Sort)的名称源于它的发明者Donald Shell,该算法是冲破了二次元时间屏障的算法之一.它通过比较相距一定间隔的元素工作,各趟所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟为止,因此希尔排序有时也叫做缩减增量排序(diminishing increament sort). 二.详细步骤: 希尔排序使用一个序列h1,h2,......ht 叫做   增量序列,只要h1=1,任何增量序列都是可行的,在使用hk的一趟增量序列后,数组中任何a[i]

经典排序算法学习笔记四——希尔排序

一.希尔排序 数据结构 数组 最差时间复杂度 根据步长序列的不同而不同.已知最好的:O(n*log ^{2}n) 最优时间复杂度 O(n) 平均时间复杂度 根据步长序列的不同而不同. 最差空间复杂度 O(n) 1.算法思想: 先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序: 然后取d2<d1,重复上述分组和排序操作: 直至di=1,即所有记录放进一个组中排序为止. 我是栗子,栗子,栗子 假设有这样一组数[ 13 14 94 33 82 25 59 94 65

从排序开始学JAVA(2)——希尔排序

希尔排序(Shell Sort)是插入排序的一种.是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序.当增量减到1时,进行直接插入排序后,排序完成. 代码实现: 1 package sort; 2 3 public class Shel

php实现的冒泡,插入排序,希尔排序,归并排序

<?php/***选择排序也就是冒泡排序,就是基于各个数据之间的对比来排序**/$arr = array(2,1,7,5,8,9,3,4,10,30,28,24);function bubbleSort($arr) {    $len = count($arr);    $k = 0;    for($i=0;$i<$len;$i++){    $k++;        for($j=$i+1;$j<$len;$j++) {            if($arr[$i] > $ar

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

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法. -----直接插入排序 package com.sort; /** * 直接插入排序 * * @author weixing-yang * * 算法思路: * 每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, * 直到所有元素全部出入完成为止. */ public class InsertionSort { public void insertionSort(in

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

本文是[数据结构基础系列(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