希尔排序: 希尔排序是对插入排序的优化,将插入排序的交换步长由1增加到h。希尔排序的思想是使数组中任意间隔为h的元素有序。步长调幅为h = 3*h + 1, 也就是1,4,13,40,121,364, 1003....这种步长算法是经过论文证明为比较高效的步长。最开始由最大步长开始排序,最大步长为w ...
分类:
编程语言 时间:
2019-12-17 13:02:22
阅读次数:
108
分治思想 将较大规模的问题分解为规模较小的子问题,通过解决规模较小的子问题得到较大规模问题的答案 比如 归并排序 或者 快速傅立叶变换 都运用了分治思想 $CDQ$分治 ~~既然加了前缀肯定和普通分治不同~~ $cdq$分治重要思想在于将问题分解为较小规模的子问题后,用一个子问题计算对另一个子问题的 ...
分类:
其他好文 时间:
2019-12-15 20:08:43
阅读次数:
101
在我之前的文章中:《高效排序之——堆排序,归并排序、快速排序》中初步介绍了堆排序的过程,但是认真的说,自己并没有叙述的十分清楚,这篇博客,我将持续更新,表明堆排序的一个过程和核心思想。 系列博客将按照下面三个问题展开: 什么是堆? 为何堆结构可以用来排序? 怎么利用堆结构进行排序? 堆排序的算法性能 ...
分类:
编程语言 时间:
2019-12-15 16:35:47
阅读次数:
97
快速排序 和归并有些类似,处理上归并是中间分隔处理,快排是找一个random值进行当作基准,然后再两边分开处理,再用递归分治的思路。 从12345-> 123,4,5-> 1,2,3, 4, 5 截取自《算法》 抽象实现 private static void sort(int[] a) { Std ...
分类:
编程语言 时间:
2019-12-12 16:37:48
阅读次数:
97
def merge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b): if a[j] < b[h]: c.append(a[j]) j += 1 else: c.append(b[h]) h += 1 if j == len(a): f ...
分类:
编程语言 时间:
2019-12-12 13:07:54
阅读次数:
87
1. 归并排序 算法核心思想 归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序 ...
分类:
编程语言 时间:
2019-12-09 21:53:41
阅读次数:
117
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 2019/12/7 10:24 * @package com.rao.sort * @Descriptio ...
分类:
编程语言 时间:
2019-12-09 14:17:41
阅读次数:
104
本文中 $n$ 代表着待排序序列的长度。 算法是否稳定:若 $a_i = a_j \ , \ i 1; merge(l,mid),merge(mid+1,r); mergesort(l,r,mid);return;//递归,先给小区间排序后大区间。 } merge(1,n); 上张图理解一下: 可用 ...
分类:
编程语言 时间:
2019-12-08 17:09:51
阅读次数:
94
原文:https://www.cnblogs.com/xiaohuiduan/p/11188304.html 十大排序算法 基本排序算法: 选择排序 插入排序 冒泡排序 高效排序算法: 梳排序 希尔排序 快速排序 堆排序 牺牲空间节约时间的高效排序: 归并排序 基数排序 基数排序 下面我将以我自己的 ...
分类:
编程语言 时间:
2019-12-03 23:49:03
阅读次数:
141
1. 分治算法 分治算法的核心就是 分而治之 ,也就是将原问题划分为若干个规模更小但结构与原问题相似的子问题,递归地解决这些子问题然后进行合并,就可以得到原问题的解。比如归并排序就是将原数据划分为左右两个部分,然后分别递归对左右两部分排序,排完序后再合并两个有序区间数据即可得到最终整体有序的数据。 ...
分类:
编程语言 时间:
2019-12-03 23:19:52
阅读次数:
139