[置顶] 桶排序(Bucket Sort)

摘要: 基本思想假设有一组长度为N的待排关键字序列K[1....n]。首先将这个序列划分成M个的子区间(桶)。然后基于某种映射函数,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字k就作为B[i]中的元素(每个桶B[i]都是一组大小为N/M的序列)。接着对每个桶B[i]中的所有元素进行比较排序(可以使用快排)。然后依次枚举输出B[0]....B[M]中的全部内容即是一个有序序列。映射函数bindex=f(key) 其中,bindex 为桶数组B的下标(即第bindex个桶), k为待排序列的关键字。桶排序之所以能够高效,其关键在于这个映射函数,它必须做到:如果关键字k1us 阅读全文

posted @ 2014-03-27 16:08 兵临天下 阅读(335) 评论(0) 推荐(0)

[置顶] 快速排序(Quick Sort)

摘要: 算法介绍 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i];4)从i开始向后搜索,即由前开始. 阅读全文

posted @ 2014-03-26 19:55 兵临天下 阅读(164) 评论(0) 推荐(0)

[置顶] 插入排序(Insertion Sort)

摘要: 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置重复步骤3,直到找到已排序的元素小于或者等于 阅读全文

posted @ 2014-03-26 15:54 兵临天下 阅读(176) 评论(0) 推荐(0)

[置顶] 鸡尾酒排序

摘要: 鸡尾酒排序也就是定向冒泡排序,鸡尾酒搅拌排序,搅拌排序(也可以视作选择排序的一种变形),涟漪排序,来回排序or快乐小时排序, 是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。例如对45 ,19, 77, 81, 13, 28, 18, 19, 77进行排序 从左到右:19,45,77,13,28,18,19,77,81 从右到左:13,19,45,77,18,28,19,77,81 从左到右:13,19,45,18,28,18,77,77,81 从右到左:13,18,19,45,18,28,77,77,81 从左到右:13,18,19,18,28,45,77, 阅读全文

posted @ 2014-03-26 14:26 兵临天下 阅读(234) 评论(0) 推荐(0)

[置顶] 冒泡排序

摘要: 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序对个项目需要O()的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要次交换,而插入排序只要最多交换。冒泡排序的实现(类似下面)通常会对已经排序好的数列拙劣地执行( 阅读全文

posted @ 2014-03-26 14:18 兵临天下 阅读(198) 评论(0) 推荐(0)

2014年3月31日

地精排序 Gnome Sort

摘要: 地精排序其实思想很简单,往前冒泡,一旦发生数据交换,就往回冒泡,直到把被交换数字放入正确位置,之后,继续前进举例例如待排数组:[6 2 4 1 5 9][0 1 2 3 4 5]看一下具体的排序过程[ i = 0 ]时啥也不干,先让i自增1,达到值为1才开始真正的比较交换前[6 2 4 1 5 9][ i = 0]交换后[6 2 4 1 5 9][ i = 1][ i = 1 ]比较6和2,发生交换,只要发生交换i就减1交换前[6 24 1 5 9][ i = 1]交换后[2 64 1 5 9][ i = 0][ i = 0 ]又成0了,啥也不干,自增变成1再说交换前[2 6 4 1 5 9] 阅读全文

posted @ 2014-03-31 20:11 兵临天下 阅读(225) 评论(0) 推荐(0)

基数排序(Radix Sort)

摘要: 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献[1]。它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。排序过程演示比如这样一个数列排序: 342 58 576 356, 以下描述演示了具 阅读全文

posted @ 2014-03-31 16:15 兵临天下 阅读(355) 评论(0) 推荐(0)

2014年3月28日

二叉查找树(Binary Search Tree)

摘要: 二叉查找树(Binary Search Tree)二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点(no duplicate nodes)。二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用 阅读全文

posted @ 2014-03-28 16:27 兵临天下 阅读(279) 评论(0) 推荐(0)

原地归并排序(Spot Merge Sort)

摘要: 原地归并排序类似归并排序,只是不需要辅助空间。示例代码#includeusing namespace std;int swap(int ds[],int begin,int mid,int end){ int lb=begin; for(int rb=mid;rblb;i--) ds[i]=ds[i-1]; ds[i]=temp; lb++; } return 0;}int spotMerge(int ds[],int begin,int mid,int end){ int i=begin,j=mid+1,index=mid+1; while(i<j && i<=e 阅读全文

posted @ 2014-03-28 10:28 兵临天下 阅读(239) 评论(0) 推荐(0)

2014年3月27日

归并排序(Merge Sort)

摘要: 算法描述归并操作的过程如下:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列设定两个指针,最初位置分别为两个已经排序序列的起始位置比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针达到序列尾将另一序列剩下的所有元素直接复制到合并序列尾示例代码#includeusing namespace std;int data[8]={1,2,3,4,1,9,6,8};int merge(int unSorted[],int sorted[],int first,int mid,int last){ int fpoint=first; i 阅读全文

posted @ 2014-03-27 21:47 兵临天下 阅读(211) 评论(0) 推荐(0)

计数排序(Counting Sort)

摘要: 计数排序是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。计数排序的特征当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n+k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用在基数排序中的算法来排序数据 阅读全文

posted @ 2014-03-27 17:00 兵临天下 阅读(252) 评论(0) 推荐(0)

2014年3月26日

选择排序(Selection Sort)

摘要: 算法思想n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:①初始状态:无序区为R[1..n],有序区为空。②第1趟排序在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。……③第i趟排序第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。示例代码#i 阅读全文

posted @ 2014-03-26 20:22 兵临天下 阅读(198) 评论(0) 推荐(0)

导航