谢尔排序(缩小增量排序)

核心思想:首先确定一个元素间隔数gap,然后将参加排序的序列按此间隔数从第1个元素开始依次分成若干个子序列,即分别将所有位置间隔为gap的元素视为一个子序列,在各个子序列中采用某种排序方法进行排序;然后减小间隔数,并重新将整个序列按新的间隔数分成若干个子序列,再分别对各个子序列进行排序,如此下去,直到间隔数gap=1;

var arr = [38,49,65,97,76,13,27,49];

shellSort(arr);
console.log(arr);

var shellSort = function(arr){
  var i, j,temp;
  var n = arr.length;
  var gap = n;
  while(gap>1){
    gap = gap/2;
    do{
      flag = 0;
      for(i=0;i<n-gap;i++){
        j = i+gap;
        if(arr[i]>arr[j]){
          temp = arr[i];
          arr[i] = arr[j];
          arr[j] = temp;
          flag = 1;
        }
      }
    }while(flag!=0);
  }
}

算法分析:谢尔排序的时间复杂度稍大于O(nlog2n)接近于O(n1.23),不稳定排序,不适合用于链表。

时间: 2024-10-13 09:59:09

谢尔排序(缩小增量排序)的相关文章

谢尔排序/缩减增量排序(C++)

谢尔排序/缩减增量排序(C++) 谢尔排序/缩减增量排序: 他通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.(好复杂) 看了一下实现代码,你就会发现它与插入排序好像,只不过在外面套了件马甲. 通过下面的代码可以发现在插入排序的基础上套上了增量规则,原本增量为1的变为增量为gap. 代码实现: 1 #include<iostream> 2 #include<vector> 3 4 using namespace std

排序算法3--插入排序--希尔排序(缩小增量排序)

希尔排序(缩小增量排序) 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组4

直接插入排序&&冒泡排序&&希尔排序(缩小增量排序)源码

public class DirectRank { public static void main(String[] args) { DirectRank aa=new DirectRank(); try { aa.judge(args); } catch (TestDefinException e2) { e2.printStackTrace(); } Integer[] a=new Integer[args.length]; try{for(int i=0;i<args.length;i++

希尔排序(缩小增量排序)

一.概念 先将整个待排序记录序列分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序. 二.复杂度 排序方法 最差时间分析 最好时间分析 平均时间复杂度 空间复杂度 稳定性 选择排序 O(n2) O(n) O(n1.3) O(1) 不稳定 三.代码实现 1 public class ShellSort { 2 int count = 1; 3 public void shellSort(int[] array){ 4 int j = 0; 5

排序 - 希尔排序(缩小增量排序)

排序过程:先取一个正整数d1 < n, 把所有相隔d1的记录放一组,每个组内进行直接插入排序:然后d2 < d1,重复上述分组和排序操作:直至di = 1,即所有记录放进一个组中排序为止. 希尔排序是不稳定的. 代码: #include <iostream> #include <cstdio> #include <ctime> #include <iomanip> using namespace std; int arr[10000]; void

希尔排序算法——缩小增量法排序

希尔排序--1959年shell提出而得名,也称为缩小增量排序算法,它是直接插入排序的改进,效率比较高,适合于中小规模的排序. 具体的算法实现步骤为:首先得知道直接插入排序的算法,然后就是选择增量给原数列进行分组,对每个分得的小组进行直接插入排序便可,然后逐渐减小这个增量,依然进行新的分组的直接插入排序,直到增量为1,此时数列便是有序数列了.具体的代码如下: 首先是对特定的增量的分组的直接插入排序: void _insert(int *A,int d,int length) //d为增量 { i

插入排序) 希尔排序 (最小增量排序)

/** * (插入排序) 希尔排序 (最小增量排序) * @author Cinn * */public class shellSort { /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] array= {48,58,50,98,69,51,27,99,100};        shlees

程序员需要掌握的排序算法之希尔排序(最小增量排序)

希尔排序(最小增量排序) 基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. package sortalgorithm; public class PublicShellSort { static void shellSort() { int[] sortList = { 1, 3, 2, 4, 10, 7, 8, 9, 5, 6 }; int n = 1,len = s

希尔排序法(缩小增量法)

2016-10-25 16:51:49 首先,要明白希尔排序法是什么.它是一种改进版的直接插入法,它是将整个无序列分割成若干小的子序列分别进行插入排序的方法. 1 #include<stdio.h> 2 3 //希尔排序法 4 void shell_sort(int a[],int n); 5 int main() 6 { 7 int i; 8 int a[6]; 9 printf("please enter five numbers:\n"); 10 for(i=1;i&