希尔排序

希尔排序

感情迁移 提交于 2019-12-05 10:54:14
#include <iostream> #include <stdio.h> using namespace std; int g_szArray[] = { 7, 3, 5, 8, 9, 1, 2, 4, 6 }; void main() { int nLen = sizeof(g_szArray) / sizeof(g_szArray[0]); int nStep = nLen / 2; while (nStep >= 1) { for (int i = 0; i < nLen; i++) { if (i + nStep > nLen - 1) { break; } if (g_szArray[i] > g_szArray[i + nStep]) { g_szArray[i] = g_szArray[i] + g_szArray[i + nStep]; g_szArray[i + nStep] = g_szArray[i] - g_szArray[i + nStep]; g_szArray[i] = g_szArray[i] - g_szArray[i + nStep]; } } nStep = nStep / 2; } for (int i = 0; i < nLen; i++) { printf("%d ", g_szArray[i]); } printf("\n");

希尔排序Shell_Sort

久未见 提交于 2019-12-05 00:53:36
概述:听到希尔排序这个名称,心里完全没有任何概念,因为这个名称不能给你提供任何有效的信息。但是它的名字又是那么的特殊,以至于学习过数据结构排序的都知道这种方法的存在。现在我们就来看一下所谓的希尔排序。 希尔排序是一种先进排序的算法,先进排序算法是指时间复杂度能够达到O(nlogn)的排序算法,除希尔排序之外,还有归并排序,快速排序,堆排序等。它的思想来源于插入排序,只不过是把数组分为若干组分别进行排序。 来源: https://www.cnblogs.com/lbrs/p/11892877.html

希尔排序

橙三吉。 提交于 2019-12-04 13:47:39
一.思想 希尔排序是一种分组插入排序算法。 首先取一个整数d1=n/2,将元素分为d1个为一组,每组相邻量元素之间距离为d1,两组数据一一进行对比按大小,从新分配两组 如[1,3,0,2] 第一次排序后变成 [0,2,1,3] 取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。 按上面那个简单例子走第二次排序为 [0,2,1,3] 按间隔1进行对比第一次然后依次变成 0与2比,0比2小顺序不变 [0,2,1,3] 2与1比,1比2小1去前面 [0,1,2,3] 依次类推...全部走完就是排好了 [0,1,2,3] 二.代码 这是网上找的精简后的代码,我自己撸的和屎一样很乱 def shell_sort(li): gap = len(li)//2 while gap>0: for i in range(gap,len(li)): tmp =li[i] j = i - gap while j >=0 and tmp <li[j]: li[j+gap]=li[j] j -=gap li[j+gap]=tmp gap /= 2 来源: https://www.cnblogs.com/pythonywy/p/11869000.html

第六章-希尔排序和堆排序

拟墨画扇 提交于 2019-12-04 13:31:48
哔哩哔哩数据结构讲解地址: https://space.bilibili.com/356198029 视频讲解地址: https://www.bilibili.com/video/av75226988 希尔排序 # include<iostream> using namespace std; void shellsort(int[], int); int main() { int array [] = {55,2,6,4,32,12,9,73,26,37}; int len = sizeof(array) / sizeof(int); cout<<"输入的原始序列: "; for(int i=0; i<len; i++) // 输出原序列 cout<<array[i]<<","; cout<<endl<<endl; cout<<" ----希尔排序开始---- " << endl; shellsort(array,len); // 调用排序函数 return 0; } void shellsort(int a[], int size) { int i, j, gap; for (gap = size / 2; gap > 0; gap /= 2) // 每次的增量,递减趋势 { for (i = gap; i < size; i++) //每次增量下,进行几组插入排序,如第一步就是

插入排序与希尔排序

霸气de小男生 提交于 2019-12-04 07:35:12
插入排序与希尔排序讲解   希尔排序是打破了O(n^2)时间复杂度的排序方法,它的理念基础是插入排序 插入排序概念   对同一个数组,我们构思出一个 有序数组arr[0] ,一个 无序数组arr[1] 开始,无序数组的遍历就是对有序数组的插入元素的筛选   相比较冒泡和选择的交换式排序方式,插入排序的替换方式更加简单,我们来直接看一下代码演示 插入排序代码 1.0版 /** * 插入排序 * 1.我们可以看做有两个数组,分别是有序和无序的 * 有序:arr[0]开始 * 无序:arr[1]开始 * 我们每次从无序的数据中获取一个,插入到有序列表中,只需要判断当 插入的数据 > 有序中的数据就可以了 * 原因:有序数据本身就是有序的 * */public void insertSorting(int[] arr){ int a; int value = arr[1]; //记录需要插入的数据 //第一次排序 for(a=0;a>=0;a--){ if(arr[a] < value){ arr[a+1] = value; break; }else{ arr[a+1] = arr[a]; } } arr[a+1] = value; //第二次排序 value = arr[2]; for(a=1;a>=0;a--){ if(arr[a] < value){ arr[a+1] = value

【排序算法】(8)希尔排序

笑着哭i 提交于 2019-12-04 04:15:19
希尔排序 2019-11-10 11:44:39 by冲冲 1、概念 希尔排序(shell排序),是插入排序(直接插入)的增强版。 特点是,在不断缩小增量的过程中,不断地排序,使得在最终使用插入排序时,序列已经基本有序。插入排序在操作基本有序的序列时效率倍增。 2、基本思想 把序列按步长gap分组,对每组小序列采用直接插入排序方法进行排序。 随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到1时,整个数据合成为一组,构成一组基本有序的序列,进行最后一趟插入排序,完成排序。 例析, 初始时,有一个大小为 10 的无序序列。 在第一趟排序中,设置 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。然后使用直接插入排序的方法对每个组进行排序。 在第二趟排序中,设置 gap2 = gap1 / 2 = 2 (取整数)。即每相隔距离为 2 的元素组成一组,可以分为 2 组。然后使用直接插入排序的方法对每个组进行排序。 在第三趟排序中,设置gap3 = gap2 / 2 = 1。 即相隔距离为 1 的元素组成一组,即只有一组。然后使用直接插入排序的方法对每个组进行排序。此时,排序已经结束。 希尔排序是不稳定性排序:图中有两个相等数值的元素 5 和 5,在排序过程中,两个元素位置交换了。 3、完整代码 1 public class

决胜经典算法之希尔排序

安稳与你 提交于 2019-12-03 23:13:47
习题答案 题目回顾 在上一篇文章中,我们以数列从小到大排列为例,讲了插入排序。结尾处的思考题如下: 如果要实现从大到小排列,上述代码该做如何修改呢? 同样,要解答这个问题也很简单,下面放上答案。 答案 我们知道,从小到大排序时,实际上就是逐个比较大小,把更小的元素向前移。同时,把整个数组分为“已排序”和“未排序”两个区域。要解决从大到小排序时,具体做法类似,只需将更大的元素向前移即可。参考如下代码: public static void insertSort(int[] arr) { int temp; int j; for (int i = 1; i < arr.length; i++) { for (j = i - 1; j >= 0; j--) { if (arr[i] < arr[j]) break; } if (j != i - 1) { temp = arr[i]; for (int k = i; k > j + 1; k--) { arr[k] = arr[k - 1]; } arr[j + 1] = temp; } } } 怎么样,你答对了吗? 本篇文章的内容是讲第四种排序方法——希尔排序。 还是之前的问题: 问题挑战 现有如下数字: 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 一共15个数字,请将其从小到大依次排列。 算法解析

数据结构学习--Java希尔排序

你说的曾经没有我的故事 提交于 2019-12-03 20:21:08
插入排序的缺陷 多次移动。假如很小的数据在靠右端的位置上,那么要将该数据排列到正确的位置上,则所有的中间数据都需要向右移动一位。 特别是如果数据量大,但是某些较小的数据排在了最后面,那么移动位置将非常消耗时间。 希尔排序的优点 通过加大插入排序中元素之间的间隔,并对这些间隔的元素进行插入排序,从而使得数据可以大幅度的移动,当完成该间隔的排序后, 希尔排序会减少数据的间隔进行排序,依次进行下去。 间隔计算 间隔h的初始值为1,通过h = 3*h + 1来计算循环,直到该间隔大于数组的大小时停止。最大值间隔为不大于数组大小的最大值。 间隔的减少 h = (h -1)/3 第三趟排序使用插入排序即可。 代码实现: package com.example.deer;public class ShellSort { public void sort(long[] arr){ //初始化一个间隔 int h = 1; //计算最大间隔 while(h < arr.length / 3){ h = h * 3 + 1; } while (h > 0){ //进行插入排序 long tmp = 0; for(int i = h;i < arr.length;i ++){ tmp = arr[i]; int j = i; while (j > h - 1 && arr[j - h] >= tmp){

希尔排序--python

雨燕双飞 提交于 2019-12-03 04:48:32
1 import random 2 import time 3 4 # 插入排序 5 def insertion_sort(arr, step): 6 for i in range(step, len(arr)): 7 for j in range(i, step - 1, -step): 8 if arr[j] < arr[j-step]: 9 arr[j], arr[j-step] = arr[j-step], arr[j] 10 else: 11 break 12 13 # 希尔排序:插入排序算法的优化算法 14 def shell_sort(arr): 15 length = len(arr) 16 step = 1 17 18 while step < length // 3: 19 step = 3 * step + 1 20 21 while step >= 1: 22 insertion_sort(arr, step) 23 step = step // 3 24 25 26 if __name__ == '__main__': 27 arr = [random.randint(0, 1000000) for _ in range(5000)] 28 print('待排序数组大小:', len(arr)) 29 start = time.time() 30

希尔排序

匿名 (未验证) 提交于 2019-12-03 00:39:02
package Sort; import java.util.Arrays; public class ShellSort { public static void main(String[] args) { int [] a = { 54, 35, 48, 36, 27, 12, 44, 44, 8, 14, 26, 17, 28 }; sort(a); System.out.println(Arrays.toString(a)); } public static void sort( int [] a) { // 设置步长,默认为数组长度的一半 int step = a.length / 2 ; while (step >= 1 ) { for ( int i = step; i < a.length; i += step) { int tmp = a[i]; int j; for (j = i; j > 0 && a[j - step] > tmp; j -= step) { a[j] = a[j - step]; // 元素后移 } a[j] = tmp; // 插入的位置,注意此时j在for循环中已经进行了一次-- } step /= 2 ; } } } 原文:https://www.cnblogs.com/yingpu/p/9266597.html