
排序算法
阳光的颜色
我喜欢程序员,他们单纯固执,容易体会到成就感。面对压力,能够挑灯夜战不眠不休。面对困难,能够迎难而上挑战自我。他们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想,用智慧开创属于自己的事业。我想说的是,其实我是一个程序员
展开
-
插入排序(C++实现)
/*根据算法导论插入排序算法编写。INSERTION-SORTfor j=2 to A.length key=A[j] //insert A[j] into the sorted sequence A[1.2..j-1] i=j-1 while(i>0&&key A[i+1]=A[i] i=i-1 A[i+1]=原创 2013-09-27 16:12:26 · 753 阅读 · 0 评论 -
内排序小结
冒泡排序是一种交换排序,基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。原创 2015-03-17 10:51:15 · 884 阅读 · 0 评论 -
分治法实现归并排序
程序调用自身的编程技巧称为递归( recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。原创 2013-09-29 11:27:07 · 2248 阅读 · 0 评论 -
快速排序
//根据算法导论提供的算法,编写程序代码:#includeusing namespace std;//实现对数组的原址排序,关键int partition(int *A,int p,int r){int x=A[r];int i=p-1;for(int j=p;j!=r;j++)if(A[j]i++;int temp=A[j];A[j]=A[i];A原创 2013-10-13 23:02:41 · 946 阅读 · 0 评论 -
严蔚敏--快速排序
快速排序的基本思想:通过一趟快速排序,将待排序记录分成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。要点1:枢轴的选择通常选第一个记录作为枢轴,但是更好的方法是“三者取中”,即比较L.r[s].key,L.r[t].key和L.r[(s+t)/2].key,取三者中关键字取中的记录为枢轴,只要将该记录和L.r[s]互原创 2015-03-10 11:19:42 · 5689 阅读 · 0 评论 -
二维数组的列排序
给出一个二维数组,请将这个二维数组按第i列(i从1开始)排序,如果第i列相同,则对相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列。如果第i列到最后一列都相同,则按原序排列。原创 2015-07-05 22:00:11 · 4636 阅读 · 0 评论 -
堆的动态操作(插入、删除、调整)
堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。最小堆便是每个节点的值都<=其左右孩子值的完全二叉树。原创 2015-03-31 10:44:50 · 5849 阅读 · 1 评论 -
双堆求中位数
双堆求中位数算法描述:1、创建两个堆(一个小根堆、一个大根堆),堆大小至少为给定数据个数的一半,向上取整;2、假定变量mid用来保存中位数,取定第一个元素,赋值给mid,即作为初始的中位数;3、依次遍历后面的每一个数据,如果比mid小,则插入大根堆;否则插入小根堆;4、如果大根堆和小根堆上的数据个数相差为2,则将mid插入到元素个数较少的堆中,然后从元素个数较多的堆中删除根节点,并将跟节点赋值给mid;5、重复步骤3和4,直到所有的数据遍历结束;此时,mid保存了一个数,再加上两原创 2015-03-31 10:40:06 · 3334 阅读 · 0 评论 -
外排序
外排序外排序(External sorting)是指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件。尔后在归并阶段将这些临时文件组合为一个大的有序文件,也即排序结果。原创 2015-03-30 22:50:24 · 900 阅读 · 0 评论 -
胜者树和败者树
胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。 不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。 胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值。在k路归并排序中经常用到。原创 2015-03-30 18:54:30 · 935 阅读 · 0 评论 -
基数排序
#pragma once#include #include //基数排序的思想:从低位到高位对关键字的各位进行桶排序,所需的逻辑桶就是基数rd//基数排序不是基于比较的排序,而是通过分配和收集两个过程//时间复杂度为O(N),空间复杂度为O(N+rd),rd为基数//稳定排序//k为排序数字的最高位数int getdigit(int data,int k){原创 2014-10-04 10:33:26 · 703 阅读 · 0 评论 -
选择排序(C++实现)
/*SELECTION-SORTfor j=1 to A.length-1 min=a[j] flag=j for i=j+1 to A.length if min> A[i] flag=i; min=A[i] t=A[j] A[j]=A[flag] A[flag]=t*/#include#inclu原创 2013-09-27 17:03:24 · 961 阅读 · 0 评论 -
堆排序(C++实现)
堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。最小堆便是每个节点的值都<=其左右孩子值的完全二叉树。原创 2013-10-08 21:09:57 · 929 阅读 · 0 评论