- 浏览: 899437 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
小宇宙_WZY:
膜拜一下大神,解决了我一个大问题,非常感谢 orz
【解惑】深入jar包:从jar包中读取资源文件 -
JKL852qaz:
感谢,遇到相同的问题!
【解惑】深入jar包:从jar包中读取资源文件 -
lgh1992314:
为什么java中调用final方法是用invokevirtua ...
【解惑】Java动态绑定机制的内幕 -
鲁曼1991:
说的都有道理,protected只能被同一级包的类所调用
【解惑】真正理解了protected的作用范围 -
鲁曼1991:
...
【总结】String in Java
1、基本概念介绍
(1) 如果待排序列中有两个相同的关键字 Ki = Kj,其顺序是Ki在Kj之前。如果经过排序之后,Ki 和 Kj的顺序颠倒了,则说明这个排序方法是不稳定 的。否则则是稳定 排序。
(2) 在内存中就可以完成的排序过程,称为内部排序 。如果待排数据量很大,内存不够容纳全部数据,在排序过程中必须对外存进行访问,则叫做外部排序 。
实际上,由于数据量级别不同。排序的方法会有很大的改变,思考排序效率的角度也不一样。这个专题系列未经特殊注明,都属于内部排序方法。
2、直接插入排序 O(N^2)
将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。下面通过一个例子来说明这个排序流程:
待排序列: 49, 38 , 65 , 97, 76 , 13, 27 ,49
插入49: 49
插入38: 38, 49
插入65: 38, 49, 65
插入97: 38, 49, 65, 97
插入76: 38, 49, 65, 76, 97
插入13: 13, 38, 49, 65, 76, 97
插入27: 13, 27, 38, 49, 65, 76, 97
插入49: 13, 27, 38, 49, 49, 65, 76, 97
#include<iostream.h> /****************************** * 直接插入排序 Straight Insertion Sort * ******************************/ class SISortion{ public: //递增稳定排序 static void inc_sort(int keys[], int size); }; void SISortion:: inc_sort(int keys[], int size){ //记录当前要插入的key int post_key; //从第二个数据开始 for(int i=1;i<size;i++){ post_key=keys[i]; int j; //将比post_key要大的前面所有的key依次后移一位 for(j=i-1;j>=0;j--){ if(post_key<keys[j]) keys[j+1]=keys[j]; else break; } //将post_key插入到合适位置 keys[j+1]=post_key; } //打印排序结果 for(int k=0;k<size;k++) cout<<keys[k]<<" "; cout<<endl; } //Test SISortion void main(){ int raw[]={49,38,65,97,76,13,27,49}; int size=sizeof(raw)/sizeof(int); SISortion::inc_sort(raw,size); }
很显然,直接插入排序算法的时间复杂度为O(N^2) 。但是不需要额外的存储空间,因此空间复杂度为O(1) 。而且直接插入排序是稳定 的。
3、折半插入排序 O(N^2)
折半插入排序和直接插入排序的不同点在“查找”上。在有序关键字序列中,每次插入的关键字采用折半查找的方法来定位。虽然折半查找的时间复杂度为O(logN),但定位后循环数据后移仍然要花费O(N)的代价。因此时间复杂度仍然是O(N^2),空间复杂度为O(1),排序是稳定的。
#include<iostream.h> /****************************** * 折半插入排序 Binary Insertion Sort * ******************************/ class BISortion{ public: static void inc_sort(int keys[],int size); }; void BISortion :: inc_sort(int keys[],int size){ int post_key; for(int i=1;i<size;i++){ post_key=keys[i]; //折半查找 int low=0,high=i-1; while(low<=high){ int middle=(low+high)/2; if(post_key<keys[middle]) high=middle-1; else low=middle+1; } //移动位置 for(int j=i-1;j>=high+1;j--) keys[j+1]=keys[j]; keys[high+1]=post_key; } for(int k=0;k<size;k++){ cout<<keys[k]<<" "; } cout<<endl; } //Test BISortion void main(){ int keys[]={49,38,65,97,76,13,27,49}; int size=sizeof(keys)/sizeof(int); BISortion::inc_sort(keys,size); }
4、希尔排序(N*logN)
希尔排序(Shell's Sort)又称缩小增量排序(Diminishing Increment Sort),它也是一种插入排序,但是在时间效率上比前面两种有较大的改进。
对本身就是“正序”的关键字序列,直接插入排序的时间复杂度将降低到O(n)。由此可以设想,对"基本有序"的序列进行直接插入排序,效率将大大提高。希尔排序方法就是基于这个思想提出来的,其基本思想就是:先将整个待排序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,在对全体记录进行一次直接插入排序。
我们用下图的例子来看看希尔排序
很明显,希尔排序对每一趟增量子序列都是一种直接插入排序。但是每一趟排序中记录关键字都是和同一子序列中前一个记录的关键字进行比较(子序列相邻关键字之间的位置相差一个增量),因此关键字较小的记录不是一步一步向前挪动,而是根据增量大小跳跃式的前进。当序列基本有序的时候,第三趟增量为1的希尔排序就是直接排序,这时只需要比较和移动少量的记录即可。
#include<iostream.h> /****************** * 希尔排序 Shell Sort * ******************/ class ShellSort{ public: //希尔递增排序 static void inc_sort(int keys[],int size); }; void ShellSort :: inc_sort(int keys[],int size){ int increment=size; //增量 do{ increment=increment/3+1; //增量逐步减少至1 int post_key; for(int i=increment;i<size;i++){ if(keys[i]<keys[i-increment]){ post_key=keys[i]; for(int j=i-increment;j>=0&&post_key<keys[j];j=j-increment){ keys[j+increment]=keys[j]; } keys[j+increment]=post_key; } } cout<<"一趟希尔排序(增量="<<increment<<"):"; for(int k=0;k<size;k++) cout<<keys[k]<<" "; cout<<endl; }while(increment>1); } void main(){ int raw[]={49,38,65,97,76,13,27,49}; int size=sizeof(raw)/sizeof(int); ShellSort::inc_sort(raw,size); }
希尔排序的性能是个很复杂的问题,主要与增量的取值有关。到目前为止,还没有人求的最好的增量结果。但是大量数据实验表明,布尔排序的时间复杂度趋近于O(N*logN) 。但不管增量如何取值,最后一趟希尔排序的增量必须为1才能真正得到有序序列。而且希尔排序是不稳定的。
发表评论
-
★经典问题—链表中的环问题
2010-06-29 14:43 4462转载:http://www.cppblog.com ... -
★经典问题—元素选择问题
2010-05-24 10:53 3365元素选择问题 : 给定线性序集中n个元素和一个整数k( ... -
【串和序列处理 8】最长平台问题
2010-04-28 16:41 37361、经典最长平台算法 已知一个已经从小到大 ... -
【排序结构7】 基数排序
2010-04-20 16:17 4593《桶排序 》中我们能够看到,数据值的范围越大,可能需要桶的个 ... -
【排序结构6】 桶排序
2010-04-19 20:28 23104从《基于比较的排序结构总结 》中我们知道:全依赖“比较”操作的 ... -
【排序结构5】 基于比较的内部排序总结
2010-04-18 16:15 6773★ 基于“比较”操作的内部排序性能大PK ... -
【排序结构4】 归并排序
2010-04-17 16:29 3331归并排序 O(N*logN) 是另一种效率很高的排序方法。&q ... -
【排序结构3】 选择排序
2010-04-14 21:10 3694(1) 简单选择排序 O(N^2) 一趟简单选择排序 ... -
【排序结构2】交换排序
2010-04-14 11:04 26651、起泡排序 O(N^2) ... -
【串和序列处理 7】LIS 最长递增子序列
2010-03-25 16:37 5850LIS: 给定一个字符串序列S={x0,x1,x2,.. ... -
【串和序列处理 6】LCS 最长公共子序列
2010-03-23 17:38 8876LCS:又称 最长公共子序列。 其中子序列(subse ... -
【串和序列处理 5】KMP子串匹配算法
2010-03-22 19:59 9195模式匹配: 在字符串 ... -
★经典问题—欧几里得求最大公约数
2010-03-20 19:21 3403问题:快速求取正整数a,b的最大公约数? ... -
【串和序列处理 4】Suffix Trie 子串匹配结构
2010-03-20 15:15 9157Suffix Trie : 又称后 ... -
【串和序列处理 3】Trie Tree 串集合查找
2010-03-18 13:40 17751Trie 树, 又称字典树,单词查找树。它来源于retr ... -
【串和序列处理 2】字符串编辑距离算法
2010-03-15 08:45 11121我们来看一个实际应用。现代搜索技术的发展很多以提供优质、高效的 ... -
【串和序列处理 1】PAT Tree 子串匹配结构
2010-03-14 19:10 11332Patricia Tree 简称PAT tree ... -
【查找结构6】动态查找树比较
2010-03-12 13:32 11339我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平 ... -
【查找结构4】红黑树 [RBT]
2010-03-10 10:58 10638大部分转载:http://yanglongylj.blog.1 ... -
【查找结构5】多路查找树/B~树/B+树
2010-03-09 11:56 18243在前面专题中讲的BST、A ...
相关推荐
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
### 数据结构之折半插入排序 #### 知识点概览 1. **折半插入排序的基本概念** 2. **折半插入排序算法原理** 3. **折半插入排序的时间复杂度分析** 4. **折半插入排序的空间复杂度分析** 5. **折半插入排序与普通...
### 数据结构之直接插入排序详解 #### 一、引言 在计算机科学中,排序算法是数据处理中不可或缺的一部分,而直接插入排序是一种简单直观的排序方法。它的工作原理类似于我们手动排序一组卡片的方式——每次从未...
### 数据结构:直接插入排序算法解析 #### 一、引言 在计算机科学领域,排序是一种常见的操作,用于将一组无序的数据按照特定的顺序排列。插入排序是一种简单直观的排序算法,它的工作原理类似于人们手工排序扑克...
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从序列的部分有序状况下,可以提高其效率。 - **实现逻辑**: - 将数组分为已排序部分和未排序部分。 - 每次从未排序部分取出...
数据结构排序算法中的折半插入排序,又称二分法,是对基本插入排序的一种改进,比普通的插入排序要快
在提供的代码中,用户可以通过输入数字1或2来选择执行插入排序或选择排序。`main()`函数使用`switch`语句来根据用户的输入调用相应的排序函数。如果用户输入的不是1或2,程序会提示错误信息。 虽然这两种排序算法在...
在数据结构中,二叉排序树(Binary Search Tree,BST)是一种十分重要的数据结构,它不仅能够存储具有排序性质的数据集合,还能够高效地完成插入、查找、删除等操作。二叉排序树插入算法是维护二叉排序树性质的关键...
1. **直接插入排序**: 直接插入排序是一种简单直观的排序算法,它的工作原理类似于打扑克牌时的排序。在已排序的部分序列中,逐个插入未排序元素,每次插入都会从后向前比较,找到合适的插入位置。这种算法对于小...
- **最好情况**:如果输入数组已经是有序的,直接插入排序只需要进行n-1次比较,时间复杂度为O(n)。 - **最坏情况**:当输入数组完全逆序时,每次插入都需要移动n-i次元素,因此总比较次数为n(n-1)/2,时间复杂度为O...
它通过设置间隔序列,将待排序的数组分组,然后对每组进行插入排序,逐渐减少间隔,直到间隔为1,整个序列变得有序。源码中,会看到间隔序列的设置以及插入排序的多次应用。 5. **堆排序**:堆排序是一种树形选择...
希尔排序是插入排序的一种优化版本,通过将待排序的元素按某个增量分组,然后对每组进行插入排序,逐渐减少增量,直到增量为1,完成排序。希尔排序的时间复杂度在最坏情况下为O(n^2),但在实际应用中通常比插入排序...
插入排序在最好情况(已排序数组)下的时间复杂度为O(n),最坏情况(逆序数组)下的时间复杂度为O(n^2),空间复杂度为O(1)。 这些排序算法的实现和性能分析是数据结构和算法课程中的基本内容,学习它们有助于理解...
1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。其时间复杂度在最坏情况下为O(n^2),在最好情况下...
数据结构(c语言版)严蔚敏 吴伟民编著 中直接插入排序、折半排序、shell排序、冒泡排序、快速排序、选择排序、堆排序的实现、归并排序,使用c语言实现
7. **希尔排序**:由Donald Shell提出的改进版本的插入排序,通过设置不同的增量将待排序的序列分割成若干子序列,分别进行直接插入排序,然后逐步减小增量,直至增量为1,完成整个序列的排序。希尔排序的时间复杂度...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
折半插入排序(Binary Insertion Sort)是一种改进的插入排序方法,它利用二分查找技术来减少比较次数,从而提高排序效率。现在我们来深入探讨这个主题。 首先,我们要了解插入排序的基本原理。插入排序是一种简单...
总的来说,折半插入排序是数据结构学习中的基础内容,理解其原理有助于更好地掌握其他高级排序算法。尽管在大规模无序数据处理上不是最优选择,但在特定情况下,其高效的比较策略能带来性能提升。在实际编程中,根据...