首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏ACM算法日常

    基础算法|7 希尔排序 HDU 1425

    我们从最初的冒泡排序算法,到上篇文章的折半插入排序算法,我们一共学习了5种排序算法,相信以大家的聪明才智肯定都消化了^_^。在本篇文章中,我们又将学习第6种排序算法——希尔排序算法。 ---- 希尔排序 让我们回想一下直接插入排序算法,是不是每次都是讲一个待排序的元素按顺序插入到一个有序序列中。 ---- 希尔排序的实现过程 例如,我们要对序列[8,6,10,13,5,7]进行希尔排序,我可以选取增量序列,d1=3,d2=1。 按第一个增量d1分组,我们可以分为3组——8与13,6与5,10与7(间隔数均为3),对每个组进行一次排序,8小于13所以8和13的位置不变;6大于5,所以6与5交换位置,得到序列[8,5,10,13,6,7 ];同理10大于7,交换位置得到序列[8,5,7,13,6,10]。

    79020发布于 2018-11-23
  • 来自专栏xiaosen

    数据结构算法--7 桶排序

    > 在计数排序中,如果元素的范围比较大(1到1亿之间),如何改造算法? > 桶排序:首先将元素分在不同的桶中,在对每个桶中的元素排序。 append(val) # 加入到i号桶 # 保持桶内的顺序 for j in range(len(buckets[i])-1,0,-1): # 步数为-1,反向冒泡排序 sotr_list # 测试 import random li=[random.randint(0,1000) for i in range(1000)] li=buckt_sort(li) print(li) 桶排序的表现取决于数据的分布 ,也就是对不同数据排序时采取不同的分桶策略 > 平均情况时间复杂度:O(n+k) > 最坏情况时间复杂度:O(n*n*k) > 空间复杂度:O(nk)

    25310编辑于 2024-03-15
  • 来自专栏图灵技术域

    数据结构7种排序算法(无基数排序)

    一、实验目的 掌握多种排序方法的基本思想,包括直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序等,并能够用高级语言实现。通过对这些算法效率的比较,加深对算法的理解。 ① 采用直接插入排序和希尔排序方法对上述待排数据进行排序并输出序后的有序序列; ② 采用冒泡排序、快速排序方法对上述待排数据进行排序并输出序后的有序序列; ③ 采用简单选择排序、堆排序方法对上述待排数据进行排序并输出序后的有序序列 这些排序算法的时间复杂度均为O(nlog2n),但就平均性能而言,快速排序被认为是目前基于比较记录关键码的内部排序中最好的排序方法,但遗憾的是,快速排序在最坏情况下的时间复杂度是O(n2),堆排序与归并排序的最坏情况时间复杂度仍为 但基数排序只适用于字符串和整数这类有明显结构特征的关键码。 (5)前面讨论的排序算法,除基数排序外,都是在顺序存储上实现的。 插入排序和归并排序都易在链表上实现,但有的排序方法,如快速排序和堆排序在链表上却很难实现。

    72120发布于 2021-05-21
  • 来自专栏技术博文

    算法-排序算法-选择排序

    /** * 排序算法-选择排序 * 选择排序(Selection Sort)算法也是比较简单的排序算法,其思路比较直观。选择排序算法在每一步中选取最小值来重新排列,从而达到排序的目的。 * 选择排序算法通过选择和交换来实现排序,其排序流程如下: * (1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。 至此,便完成了对原始数组的从小到大的排序。 * * 选择排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行n-1步的中间排序。 * 这种排序方法思路很简单直观,但是缺点是执行的步骤稍长,效率不高。 size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序前的数组

    2.3K30发布于 2021-03-11
  • 来自专栏技术博文

    算法-排序算法-冒泡排序

    /** * 排序算法-冒泡排序 * 冒泡排序(Bubble Sort)算法是所有排序算法中最简单、最基本的一种。 * 冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的。 * 冒泡排序的思路: * (1)对数组中的各数据,依次比较相邻的两个元素的大小。 * (2)如果前面的数据大于后面的数据,就交换这两个数据。经过第一轮的多次比较排序后,便可将最小的数据排好。 * 冒泡排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行(i = n-1)次的外层循环。 * 每次内部的排序随着步骤的递增,需要排序的数据逐步减少,所以需要 (n - i)次的内层循环,注意:i从1开始 */ import java.util.*; public class BubbleSort :" + Arrays.toString(ints)); } System.out.println("最终排序后的数组:" + Arrays.toString(ints)

    1.5K20发布于 2021-03-08
  • 来自专栏技术博文

    算法-排序算法-快速排序

    /** * 排序算法-快速排序 * 快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序思想的。快速排序算法对冒泡排序算法进行了改进,从而具有更高的执行效率。 * 快速排序算法通过多次比较和交换来实现排序,过程如下: * (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 * (3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样将左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 当左、右两部分各数据排序完成后,整个数组的排序也就完成了。 :" + Arrays.toString(ints)); quickSortFun(ints, 0, size - 1); System.out.println("排序后的数组

    1.4K10发布于 2021-03-17
  • 来自专栏技术博文

    算法-排序算法-希尔排序

    /** * 排序算法-希尔排序 * 冒泡排序算法、选择排序算法和插入排序算法,虽然思路比较直观,但是排序的效率比较低。 * 对于大量的数据需要排序时,往往需要寻求其他更为高效的排序算法。 Shell排序算法便是其中一种 * Shell排序算法严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序,思路如下: * (1)将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2 * (3)然后,再变为n/4个序列,再次排序。 * (4)不断重复上述过程,随着序列减少最后变为一个,也就完成了整个排序。 size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序前的数组 :" + Arrays.toString(ints)); } System.out.println("排序后的数组:" + Arrays.toString(ints))

    1.2K20发布于 2021-03-12
  • 来自专栏大数据文摘

    视觉直观感受 7 种常用排序算法

    点击标题下「大数据文摘」可快捷关注 10月14日发布《统计世界的十大算法》后,很多朋友在后台询问,哪里有“视觉直观感受 7 种常用排序算法”,今天分享给大家,感谢todayx.org。 堆排序 介绍: 堆积排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。 排序效果: 6. 插入排序 介绍: 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。 将新元素插入到该位置中 重复步骤2 排序效果: (暂无) 7. 希尔排序 介绍: 希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。

    71250发布于 2018-05-22
  • 来自专栏乐行僧的博客

    7-直接插入排序算法

    思想: 将待排序数组看作是有序和无序两部分。 初始状态,有序部分只有一个元素,其余数组元素均属于无序部分的。 按照顺序每次从无序的部分数组中选择一个元素将其插入在有序部分数组合适的位置上即可。 数组元素基本有序时,直接插入排序时间复杂度接近与O(n),性能非常好。 a[j] = a[j - 1]; } a[j] = e; } } int main() { int a[] = {3, 1, 2, 4, 7,

    30820编辑于 2022-02-25
  • 来自专栏算法channel

    纯碎coding:7个最常用的排序算法

    1统一符号表达 算法中使用的交换函数,代码如下, 1 //swap element at i to at j 2 private static void swap(int[] array, ,int j){ 3 int tmp = array[i]; 4 array[i] = array[j]; 5 array[j] = tmp; 6 } 以下 7 种排序算法都实现了序列的非降序排列,函数参数代表的含义一般统一定义为: array: 待排序的数组,类型为一维整形数组 n:元素个数 i:一般为外层循环索引,或表示排序区或未排序的开始或结束索引 j :一般为内层循环索引,或表示未排序区或排序的结束或开始索引 lo:数组计算区间的开始索引 hi:数组计算区间的结束索引 d :分组长度 k:分组索引 2冒泡排序 冒泡排序的代码如下: 1 //bubble 11 array[j + 1] = insert; //j+1 is insert pos 12 i++; 13 } 14 } 7希尔排序

    50200发布于 2018-07-31
  • 来自专栏技术博文

    算法-排序算法-插入排序

    /** * 排序算法-插入排序 * 插入排序(Insertion Sort)算法通过对未排序的数据执行逐个插入至合适的位置而完成排序工作。 * 插入排序算法的思路比较简单,应用比较多。 * 插入排序算法通过比较和插入来实现排序,其排序流程如下: * (1)首先对数组的前两个数据进行从小到大的排序。 * (2)接着将第3个数据与排好序的两个数据比较,将第3个数据插入合适的位置。 最后,便完成了对原始数组从小到大的排序。 * * 插入排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行n-1步的中间排序。 * 这种排序方法思路简单直观,在数据已有一定顺序的情况下,排序效率较好。但如果数据无规则,则需要移动大量的数据,其排序效率也不高。 size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序前的数组

    95220发布于 2021-03-11
  • 来自专栏java技术学习之道

    7大经典的排序算法总结实现

    作者 : liuyang0 来源 : 博客园 常见排序算法总结与实现 本文使用Java实现这几种排序。 以下是对排序算法总体的介绍。 冒泡排序 比较相邻的元素。 int i = 0; i < a.length; i++) { 5 flag = 0; 6 for (j = 1; j < a.length - i; j++) { 7 然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 归并排序算法依赖归并操作。

    54260发布于 2018-07-02
  • 来自专栏平凡文摘

    7大经典的排序算法总结实现

    作者 : liuyang0 来源 : 博客园 常见排序算法总结与实现 本文使用Java实现这几种排序。 以下是对排序算法总体的介绍。 冒泡排序 比较相邻的元素。 int i = 0; i < a.length; i++) { 5 flag = 0; 6 for (j = 1; j < a.length - i; j++) { 7 然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 归并排序算法依赖归并操作。

    49620发布于 2018-07-03
  • 来自专栏C++打怪之路

    排序7:归并排序

    目录 1.排序思想 2.图解 3.递归版本 3.1子排序代码实现 3.2 剩下的主体部分 4.非递归版本 5.特性总结 ---- 1.排序思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法 ,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并排序核心步骤:分解、合并。 2.图解 3.递归版本 因为要排序,还要递归。我们肯定是要写一个子排序的,下面来说说子排序的实现逻辑。 我们肯定是要开额外空间来存储的,然后每次将排序结果拷贝回原数组中。 合并:分到最小排序之后就要合并了,合并之后再进行排序,每次排序完要把排序结果拷贝回原数组中。 分到最细的时候每次排序是两个数字排序或者是一个数字原地不动,那么我们可以设置一个for循环,每次 i 加上两个gap的值,就做到了跳到下一个需要的排序的区间。

    69230编辑于 2023-03-31
  • 来自专栏极客慕白的成长之路

    视觉直观感受 7 种常用的排序算法

    归并排序 介绍: 归并排序(Merge sort,中国台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。 堆排序 介绍: 堆积排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。 排序效果: 6. 插入排序 介绍: 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。 将新元素插入到该位置中 重复步骤2 排序效果: (暂无) 7. 希尔排序 介绍: 希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。

    36640发布于 2018-08-03
  • 来自专栏后端技术探索

    视觉直观感受 7 种常用的排序算法

    归并排序 介绍: 归并排序(Merge sort,中国台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。 堆排序 介绍: 堆积排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。 排序效果: 6. 插入排序 介绍: 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。 将新元素插入到该位置中 重复步骤2 排序效果: (暂无) 7. 希尔排序 介绍: 希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。

    78721发布于 2018-08-09
  • 来自专栏用代码征服天下

    算法——排序算法

    8 3 7 5 6 最小数据2,把2放在首位,2原来就在首位,不需要交换 排序结果:2 8 3 7 5 6 ---------------------------------------------- --------- 第二趟排序: 原始数据:8 3 7 5 6(2已经排好序了,不需要再排序了) 最小数据3,8和3交换 排序结果:2 3 8 7 5 6 ----------------------- -------------------------------- 第三趟排序: 原始数据:8 7 5 6(2、3已经排好序了,不需要再排序了) 最小数据5,5和8交换 排序结果:2 3 5 7 8 6 6和7交换 排序结果:2 3 5 6 8 7 ------------------------------------------------------- 第五趟排序: 原始数据:8 7(2、3、5、 6已经排好序了,不需要再排序了) 最小数据7,7和8交换 排序结果:2 3 5 6 7 8 排序完成 代码示例: 1 package com.alibaba; 2 3 import org.junit.jupiter.api.Test

    1.1K10编辑于 2022-05-09
  • 来自专栏JavaEE

    排序算法 --- 桶排序

    一、排序思想 之前将的计数排序,有些局限性,比如数列最大值和最小值差距不能太大,而且只能排整数。桶排序就对这些局限性做了弥补。桶排序的思想就是每个桶代表一个区间范围,里面可以装若干个元素。 然后对这些桶内部进行排序,最后遍历这些桶,那么数列就是有序的了。 桶排序 然后开始遍历原始数列,把元素放入对应的桶中,如下: ? 桶排序 对每个桶内部的元素进行排序,如下: ? 桶排序 最后遍历所有的桶,输出的元素就是有序的了。 桶排序的缺点:如果数据分布不均衡,比如最大值1000,最小值0.5,剩余元素都是零点几的,也就是说最后一个桶放最大元素,其他元素都在第一个桶,这样性能就会下降,并且创建了很多空桶,浪费空间。 (arrNum - 1) / (max - min)); buckets.get(num).add(arr[i]); } // 对每个桶内部进行排序

    63651发布于 2020-10-10
  • 来自专栏JavaEE

    排序算法 --- 快速排序

    一、排序思想 将数组中的一个数作为基准,比该数小的放到左边,比该数大的放到右边; 对左右两边再进行上述操作,即把左边当成一个新数组,找新的基准数,右边也一样; 直到不能再分割下去为止。 ---- 案例: 假如待排序列如下: ? 初始状态 选定6为基准数,然后先从右边开始遍历,找到一个比基准数小的数,如下图: ? 找到比基准数大的7 这个时候,左右两边都先停下,交换5和7的位置,结果如下: ? 第一次交换完成 然后继续从右边开始遍历,即从7的位置开始,找到比基准数小的数,如下: ? 第一躺排序完成 此时6左边的都是比它小的,右边的都是比它大的。左边部分和右边部分看成是两个新的待排序列,两个序列都按照上述方式再进行排序,先排左边,再排右边。 ,左边和右边看成新数组,重复上述步骤 sort(arr, j+1, right); // 排右边 sort(arr, left, i-1); // 排左边 } 快速排序之所以成为快速排序

    98231发布于 2020-10-10
  • 来自专栏程序编程之旅

    排序算法:冒泡排序

    冒泡排序算法的运作如下:(从后往前) ​1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 若记录序列的初始状态为”正序”,则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为”逆序”,则需进行n(n-1)/2次比较和记录移动。 因此冒泡排序总的时间复杂度为O(n*n)。 : 在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前设置 在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序;

    84120发布于 2021-01-21
领券