C++排序方法:插入排序、交换排序、选择排序
2017-02-07 20:58
495 查看
数据排序(sorting)是最重要的计算应用之一。例如查字典,字典中的词条是按序存放的,我们才能按字母顺序找到要查的字。又如图书馆的藏书也是按书的编号有序排列的。在计算机上数据库里的资料也是有序排列的。
排序的概念:
排序(sorting)是数据处理中经常使用的一种重要运算,其功能是将数据元素的无序序列调整为有序序列。
数据元素中一般有多个数据项,排序可选择其中一个可排序的数据项(可进行比较运算)作为依据,称为排序关键字。
关键字举例:我们对高考考生的统计表进行排序,可根据考生的准考证号,这样的关键字可以保证排序结果的唯一性,称主关键字。但为了便于录取,我们也可以按高考总分排序,只可称关键字,这样同一分数的人很多,这些人的排名可再取一个次关键字如数学或语文分来排序,以减少重复排名的随意性。
从小到大排序称升序,反之为降序。
最常见的三类方法是插入排序、选择排序和交换排序。
当插入第i(i>=1)个元素sl[i]时,前面的元素:sl[0],sl[1],…,sl[i-1]已经排好序,我们将sl[i]的关键字与sl[i-1], sl[i-2],…,的关键码顺序进行比较,找到第一个比它小的,则sl[i]插到该元素之后。那么怎么保证前面的元素排好序呢?可以从第一号元素开始,前面只有第0号元素 ,这一个元素肯定是排好序的!参见下图。
图6.5 直接插入排序的过程(演示过程)
直接插入排序算法中用了一个临时变量temp,要插入的元素放到temp中,这样插入前各元素后移时允许将该元素冲掉。具体算法代码请参见
【例6.6】升序直接插入排序算法。(查看源码)
◆ 2、对半插入排序(Binary Insert Sort):是用对半查找的思想取代顺序查找。
对半插入排序要快于插入排序,具体算法代码请参见
【例6.7】升序对半插入排序算法。(查看源码)
冒泡排序基本思想(参见图6.6):最左列为最初的情况,最右列为完成后的情况。首先我们从一列数据底部开始,相邻的两数据进行比较,小的数放上面,一趟比较下来,最小的数据冒到了最上面。再缩小区域,按同样方法继续下一趟交换,如果有一趟比较中没有发生交换,则已排好序。图6.6中,第5列就已排好序,若再继续下一趟就不会发生交换。(查看动画演示)
图6.6 从下往上扫描的冒泡程序
【例6.8】冒泡排序算法,作为Orderedlist<T,size>类的成员函数。(查看源码)
直接选择排序(Straight Selection Sort)是最简单的(参见图6.7)。此方法的最大优点是非常易读。缺点是做过的工作和序列的部分有序性利用不上,效率低。选择排序中也有可能利用到以前的工作的方法,如堆排列(Heap Sort)。(查看动画演示)
【例6.9】直接选择排序,作为Orderedlist<T,size>类的成员函数。(查看源码)
排序的概念:
排序(sorting)是数据处理中经常使用的一种重要运算,其功能是将数据元素的无序序列调整为有序序列。
数据元素中一般有多个数据项,排序可选择其中一个可排序的数据项(可进行比较运算)作为依据,称为排序关键字。
关键字举例:我们对高考考生的统计表进行排序,可根据考生的准考证号,这样的关键字可以保证排序结果的唯一性,称主关键字。但为了便于录取,我们也可以按高考总分排序,只可称关键字,这样同一分数的人很多,这些人的排名可再取一个次关键字如数学或语文分来排序,以减少重复排名的随意性。
从小到大排序称升序,反之为降序。
最常见的三类方法是插入排序、选择排序和交换排序。
插入排序(Insert Sorting)
◆ 1、直接插入排序的思想是(以升序为例):当插入第i(i>=1)个元素sl[i]时,前面的元素:sl[0],sl[1],…,sl[i-1]已经排好序,我们将sl[i]的关键字与sl[i-1], sl[i-2],…,的关键码顺序进行比较,找到第一个比它小的,则sl[i]插到该元素之后。那么怎么保证前面的元素排好序呢?可以从第一号元素开始,前面只有第0号元素 ,这一个元素肯定是排好序的!参见下图。
图6.5 直接插入排序的过程(演示过程)
直接插入排序算法中用了一个临时变量temp,要插入的元素放到temp中,这样插入前各元素后移时允许将该元素冲掉。具体算法代码请参见
【例6.6】升序直接插入排序算法。(查看源码)
◆ 2、对半插入排序(Binary Insert Sort):是用对半查找的思想取代顺序查找。
对半插入排序要快于插入排序,具体算法代码请参见
【例6.7】升序对半插入排序算法。(查看源码)
交换排序
交换排序基本思想是:按关键字两两排序对象,如果发生逆序则交换之,直到所有的对象都排好序为止。这里介绍冒泡排序(Bubble Sort)。冒泡排序基本思想(参见图6.6):最左列为最初的情况,最右列为完成后的情况。首先我们从一列数据底部开始,相邻的两数据进行比较,小的数放上面,一趟比较下来,最小的数据冒到了最上面。再缩小区域,按同样方法继续下一趟交换,如果有一趟比较中没有发生交换,则已排好序。图6.6中,第5列就已排好序,若再继续下一趟就不会发生交换。(查看动画演示)
图6.6 从下往上扫描的冒泡程序
【例6.8】冒泡排序算法,作为Orderedlist<T,size>类的成员函数。(查看源码)
选择排序(Selection Sort)
选择排序基本思想是:例如升序,每一趟从待排序的记录中选出关键字最小的元素,放在已排好序的子序列的后面,直到全部记录排序完成。直接选择排序(Straight Selection Sort)是最简单的(参见图6.7)。此方法的最大优点是非常易读。缺点是做过的工作和序列的部分有序性利用不上,效率低。选择排序中也有可能利用到以前的工作的方法,如堆排列(Heap Sort)。(查看动画演示)
【例6.9】直接选择排序,作为Orderedlist<T,size>类的成员函数。(查看源码)
相关文章推荐
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
- 排序算法整理(C++):插入排序、交换排序、选择排序、归并排序
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- 直接插入排序的C++实现及随机数组的产生方法
- Java实现数据排序(冒泡、选择、插入、快速排序)---方法持续更新中
- java算法之 排序(插入、交换、选择、归并、分配排序)
- 插入排序、交换排序、选择排序、归并排序、基数排序
- 直接选择排序的C++实现及随机数组的产生方法
- 五种排序方法(选择、冒泡、快排、插入、希尔)
- Java 选择排序、冒泡排序、快速排序、直接插入排序、Java自带的排序等方法的使用和总结
- 四种经典排序 冒泡,快排,插入,选择 C++实现
- 插入,选择,交换,归并,基数排序
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- 六种排序方法的学习(直接插入、希尔、冒泡、快速、选择、归并)
- 几种常用的排序算法:插入排序、冒泡排序、选择排序的算法及C++实现
- C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
- 三种低级排序方法(冒泡 选择 插入)
- 三种排序方法(冒泡、选择、插入)
- 插入排序、选择排序、交换排序和归并排序