本文就是介绍一些常见的排序算法。排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序、选择排序、冒泡排序、快速排序(重点)、堆排序、归并排序等等。看下图: 给定数组:int data[] = {9,2, ...
分类:
编程语言 时间:
2016-05-11 12:54:24
阅读次数:
313
前言
在整理算法题的时候发现,大根堆(小根堆)这种数据结构在各类算法中应用比较广泛,典型的堆排序,以及利用大小根堆这种数据结构来找出一个解决问题的算法最优解。因此,我打算单独将关于堆的应用独立总结出来,后面每遇到一种跟堆结构相关的应用都放到这个目录下。
堆的定义
n个关键字序列L[1…n]称为堆,当且仅当该序列满足:
1. L(i)<=L(2i)且L(i)<=L(2i+1)或...
分类:
编程语言 时间:
2016-05-10 12:55:56
阅读次数:
670
拿到这个题目我想到了很多方法,但是在我想到的方法中,要把在100万个数中找到前k个数,都不适用。最后通过我的不断研究,我想到了我认为最简单的方法,就是利用堆来做这道题目。下面我分析一下我用堆排序的思路:1.我先建一个大小为k的堆。2.把100万中前k个数放到这个堆中。3...
分类:
其他好文 时间:
2016-05-09 18:56:37
阅读次数:
171
(1)从1000个数据中找到k个最大数据首先看到这个题时,可能会想到先将这1000个数据进行降序排序,即取出的前k个元素最大。时间复杂度为O(N^2),使得程序效率低。如何解决这个问题呢?我们的堆就派上用场喽!解题思路:可先创建一个数组topK[k],将100w中的前k个数据放入数组topK..
分类:
编程语言 时间:
2016-05-09 11:09:36
阅读次数:
1382
首先将数组中的元素生成大堆,依次将数组的第一个元素(大堆的根节点)与数组最后一个元素进行交换,在将数组的总个数依次减一,将数组重新生成大堆,依次,最终数组中的元素排列即为大堆的排序情况。voidCreate(intparent,inta[],intsize){ intchild=2*parent+1; while(child&..
分类:
编程语言 时间:
2016-05-08 20:02:34
阅读次数:
171
常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间。 index.html main.js main.js 排序效果: ...
分类:
编程语言 时间:
2016-05-08 13:48:56
阅读次数:
309
内部排序 一、插入 1.直接插入 2.希尔排序 二、交换 1.冒泡 2.快速排序 三、选择 1.简单选择 2.堆排序 3.归并排序 四、基数排序 本人能力有限,代码中可能存在问题,欢迎大家指正。我通过一些数据的测试,都基本通过,希望对一些朋友有用,谢谢 一、 /******************* ...
分类:
编程语言 时间:
2016-05-08 13:20:32
阅读次数:
172
堆排序算法时间复杂度为 O(nlgn)
堆从结构上讲,应该是一棵完全二叉树。在堆排序中一个很重要的概念是,维持最大堆的特性。最大堆就是每个节点的值比它左右孩子节点都要大。
我们首先将非叶子节点 都维持最大堆的特性一次。就是说保证非叶子节点它的左右孩子都比它的值要小。build_max_heap函数实现
其中,一个很重要的函数是max_heapify,它的功能是控制单个节点,保证它的孩子节点小...
分类:
编程语言 时间:
2016-05-07 08:53:38
阅读次数:
154
1、这篇文章中,涉及到的排序算法有:冒泡、选择、堆排序、快排。
2、算法原理概述
/// -------------- 冒泡排序 ----------------
/* 冒泡排序
算法原理:
1、比较相邻的两个元素,若第一个比第二个大,就交换他们两个
2、从第一个到结尾的最后一对,对每一对相邻元素做同样的操作。最后的元素应该是最大的数
3、除了最后一个,...
分类:
编程语言 时间:
2016-05-06 14:57:06
阅读次数:
234
和前一题差不多,把归并排序换成了堆排序。要点还是每一次排序进行判断 开始犯了个错误 堆排序该用origin2 结果一直在排序origin ,误导了半天以为是逻辑错误。。。一直在检查逻辑 建立最大堆 排序并调整下滤 According to Wikipedia: Insertion sort iter ...
分类:
编程语言 时间:
2016-05-05 12:27:03
阅读次数:
347