首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法】希尔排序学习笔记

【参考资料】 《算法(第4版)》         — — Robert Sedgewick, Kevin Wayne 在本篇笔记里,我从简单的插入排序,到希尔排序,中间的一系列算法,看起来就像是插入排序的...这些点分别是: 直接插入排序(插入排序1.0版本) 基于插入排序的简单优化(插入排序1.1和1.2版本) 折半插入排序(插入排序2.0版本) 希尔排序(插入排序3.0版本) 直接插入排序(插入排序1.0...因此,折半插入排序的时间复杂度仍然是O(n^2) 希尔排序(插入排序3.0) 出现的原因 总的来说,插入排序是一种基础的排序方法,因为移动元素的次数较多, 对于大规模的复杂数组,它的排序性能表现并不理想...所以根据插排优于处理小型,部分有序数组的特性, 人们在插入排序的基础上设计出一种能够较好地处理中等规模的排序算法: 希尔排序 实现的过程 希尔排序又叫做步长递减插入排序或增量递减插入排序 (下面的h就是步长...,也即时间复杂度小于O(n^2), 例如我们上面选择的1,4 ,13,40,121递增序列的算法, 在最坏情况下比较次数和N^(3/2)成正比。

76680

算法学习---选择排序

引言 数据结构和算法对于程序员来说相当重要,我最近打算学习这一门课程,并以博客的形式记录自己的学习过程和心得,目前暂时从两本书入手,一本是《大话数据结构》,一本书《算法图解》,我先从《算法图解》,这本手开始学习吧...如果你最近也在学习,可以关注一起学习,一起交流哦~ 选择排序 学习选择排序算法之前先回顾一下数组和链表的特点: 数组擅长随机读取,而链表擅长插入和删除。 下面是常见数组和链表操作的运行时间。...数组 链表 读取 O(1) O(n) 插入 O(n) O(1) 删除 O(n) O(1) C语言实现选择排序 #include "stdio.h" #include "stdlib.h" #include...,将元素从小到大重新排序 int selectionSort(int *p,int len) { int i = 0; int smallest; static int temp;//临时变量...++){ printf("%d,",arr[i]); } printf("\n"); } 运行结果 原数组元素:arr[10] = {10,9,8,6,7,4,3,1,2,5} 该排序算法的核心用一张图来表示

11310
您找到你想要的搜索结果了吗?
是的
没有找到

算法】堆排序学习笔记

参考资料 《算法(第4版)》          — — Robert Sedgewick, Kevin Wayne 什么是二叉堆 在了解堆排序之前, 最重要的当然是理解二叉堆的概念。...k等于k/2,向下一层则令k等于2k或者2k+1 也就是说,通过这层数字关系, 我们可以找到任意一个堆中节点的父节点和子节点(如果有的话),并进行比较, 在这层基础上,我们就可以来设计我们的堆有序化的算法了...堆有序化的基本算法:上浮和下沉 堆排序的核心,就是堆有序化的算法 而堆有序化的基础,就是针对单个堆节点的有序化 单个堆节点的有序化有两种情况: 当某个节点变得比它的父节点更大而被打破(或是在堆底加入一个新元素时候...我们上面所学习的堆的基本操作之一——删除最大元素,使用的Heap.delMax方法的有趣之处在于:每次调用它,都会 1.删除最大元素 2.返回该最大元素 3.使得剩下的堆中元素重新恢复有序 这样一来,依次删除返回的就是最大值...而在下沉排序阶段,我们从堆中按递减顺序取得所有元素并得到排序结果。

1.1K80

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

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

1.5K30

算法学习之路 | 希尔排序

思路 给定一个数组,内容都为数字 外层循环分隔整个数组为多个长度为增量(增量为整数,每次循环除以2)的子序列 外层每分隔一次,内层从增量对应的键开始循环直到数组最后一位 与选择排序同理,如果 当前键位...插入当前键位到该子序列对应的另一个值左边(步长为增量) 继续按步长为增量进行累减(当前键位 - 增量 - 增量... )直到当前键位的值大于该子序列对应的另一个值 外层循环结束前已经是一个相对有序的数组了,最后一次循环步长为1,与正常选择排序相同...步长为增量 $current = $array[$j]; while($index >= 0 && $array[$index] > $current){ //相对选择排序只是步长为增量而不为

15010

算法学习之快速排序

快速排序是一种经常使用的排序算法,标准c里已经包含了这个算法的实现,在头文件中的qsort(),快速排序的思想是,从一个数组中挑出一个数当中枢轴,这个数的左边所有的数都比它大,右边的数都比它小...一次快排算法描述:1.从一个数组中挑出一个数当关键字中枢轴,一般选择第一个数                                2.两个指针i,j一个直到数组最前方,一个最后方,i指向前边,...                                4.重复2和3,直到i>=j 为止 这样一次快排就完成了,保证了中枢轴左边的都小于它,右边的都大于它,但是它的左边子数组还没排好,右边也没排好,所以下面我就可以递归的定义此算法了...,直到所有的都排序完成。...#include /*快速排序算法,复杂度O(nlogn)*/ void quick_sort(int *a,int from,int to) { if(from >= to

16820

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

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

85410

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

/** * 排序算法-希尔排序 * 冒泡排序算法、选择排序算法和插入排序算法,虽然思路比较直观,但是排序的效率比较低。 * 对于大量的数据需要排序时,往往需要寻求其他更为高效的排序算法。...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))

71620

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

/** * 排序算法-冒泡排序 * 冒泡排序(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)

92020

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

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

57220

Js排序算法_js 排序算法

一、概念 快速排序算法由 C. A. R. Hoare 在 1960 年提出。...它的时间复杂度也是 O(nlogn),但它在时间复杂度为 O(nlogn) 级的几种排序算法中,大多数情况下效率更高,所以快速排序的应用非常广泛。...快速排序的一次划分算法从两头交替搜索,直到low和high重合,因此其时间 复杂度是O(n) ; 而整个快速排序算法的时间复杂度与划分的趟数有关。...这样,长度为n的数据表的快速排序需要经过n趟划分,使得整个排序算法的时间复杂度为O(n2)。 如果需要优化,那么我们希望每次区分的时候都取到中间数。...JavaScript实现五种排序算法 关于快速排序的不稳定性说明 JavaScript实现十大排序算法(附有更好理解的GIF动态图) 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人

25.2K20

算法学习笔记(四):堆排序

(三)  堆排序的过程 分为2个过程: 1、      建立大顶堆或小顶堆。...(简单的说,就是把列表排成符合上面列出来的公式) 2、      对大顶堆或小顶堆进行排序 (四)  建立大顶堆(理解了大顶堆,小顶堆差不多,可以自己尝试实现,可能写一遍就比较清晰了) 从第二点中我们知道...largest],A[i] 31 #交换数据后,以该节点为根的子树可能违反大顶堆的性质,所以递归调用自身 32 maxHeap(A,largest) (五)  对大顶堆进行排序...排序的过程就是在大顶堆的基础上,重复1、2、3步骤(这里请注意,我们的列表的第一个元素是‘X’,需要处理的数据是从A[1]开始的) 1、交换A[1]  A[len(A)]。...所以调用maxHeap()维护大顶堆的性质 1 #堆排序 2 def heapSort(A): 3 # 这里返回的是一个大顶堆 4 A = buildHeap(A) 5

53130

算法——排序算法

1、冒泡排序  基本思想:现在有一个数组arr= {12,35,99,18,76},需要将其从小到大排序 第一次冒泡:首先我们将数组第一个数(arr[0])和第二个数(arr[1])进行比较,如果第二个数比第一个数大...: 原理:每一次循环从未排序的数中找出最小的数,然后与已经排好序的数的下一个数进行交换,直到全部记录排序完毕 基本思想:给定数组:int[] arr={里面n个数据},第一次排序从arr[0]~arr[...--------- 第二趟排序: 原始数据: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,7和8交换 排序结果:2 3 5 6 7 8 排序完成 代码示例: 1 package com.alibaba; 2 3 import org.junit.jupiter.api.Test

59810
领券