前言
排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。
认识排序
排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。
一、选择排序法是什么?
1.简要介绍
选择排序法属于枚举法的一种应用,它就是反复地从未排序的数列中找出最小的数据元素,再将其与某个指定位置的数据元素进行交换,经过每次扫描都可以把该次扫描时数列中的数据元素的最小的那个放到前面的指定位置,从而最终得到的结果就是排序后的数列。
2.图形理解
下面我们用选择排序法对下图中的这5个数据元素进行从小到大的排序:
首先找到这5个数据元素中的最小值,并且与数列中的第一个元素进行交换,如图所示:
从第二个值开始找,找到此时剩余的四个数据元素(不包含第一个)中的最小值,再与第二个数据元素进行交换,如图所示:
从第三个值开始找,找到此时剩余的三个数据元素(不包含第一个、第二个)中的最小值,再与第三个数据元素进行交换,如图所示:
从第四个值开始找,找到此时剩余的两个数据元素(不包含第一个、第二个、第三个)中的最小值,再与第四个数据元素进行交换。这样经过四次扫描下来也就完成了对这5个数据的全部排序,如图所示:
3.算法分析
n个元素的选择排序法需要执行n-1次扫描排序操作:
①选择排序法是以最大值或最小值直接与最前方未排序的键值进行交换,数据排列的顺序可能被改变,所以它不属于稳定排序。
②选择排序法只需要一个额外的空间,所以空间复杂度为最佳。
③选择排序法比较适用于数据量小或已经有部分数据排好序的情况。
④该排序法无论是最坏情况,最好情况还是平均情况它都是需要去找到最大值或最小值,因此其时间复杂度为O(n^2)。
二、案例实现
1.案例一
①范例情况:使用选择排序法对9,7,5,3,4,6这六个数据进行从小到大的排序,并且输出每次扫描下的排序情况。
②代码展示:
#include<iostream> #include<iomanip> using namespace std; #define size 6 //事先声明排序数据的个数 class select { public: int data[size]; void showresult(){ for (int i = 0; i < size; i++) cout << setw(2) << data[i]; cout << endl; } void select_start() { for (int i = 0; i < size-1; i++) //扫描5次 { for (int j = i + 1; j < size; j++) //从i+1个数据起开始比较,目的就是从中找出最小值 { if (data[i] > data[j]) //比较第i个和第j个元素 { int temp; temp = data[i]; data[i] = data[j]; data[j] = temp; } } cout << "第" << i+1 << "次扫描:"; showresult(); } } }; void text() { select s; cout << "请输入要排序的"<<size<<"个数据"<< endl; for (int i = 0; i < size; i++) cin>>s.data[i]; cout << "排序前:" << endl; s.showresult(); s.select_start(); cout << "排序后:" << endl; s.showresult(); } int main() { text(); }
③结果展示:
总结
以上就是对选择排序法的简单讲解,以上的案例实现中我们运用的是简单的直接选择排序的一种思想,在后续的章节中会陆续讲到树形选择排序和堆排序来进阶的去体会选择排序法带给我们的排序编程思想。