经典算法(二)----选择排序----图解法让你快速入门
引言
只要设计到数据,就会涉及到数据的排序问题,比如给你随机给你五个整数 3,1,5,2,4 。让你从小到大进行排序,那我们该怎样才是实现对这些整数的排序呢 ?
答案是多种多样的,比如用冒泡排序、选择排序、堆排序、归并排序、快速排序等等,这些排序方法都可以实现对整数排序,而这篇文章要讲的就是选择排序
本文将从以下几个问题对选择排序进行分析和讲解:
- 什么是选择排序?
- 选择排序的大概过程是什么?
- 怎样用代码实现选择排序?
- 选择排序的代码详解。
什么是选择排序?
下面看百度百科对选择排序的定义:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
简单来说:选择排序就是经过一轮一轮的查找,每一轮都从待排序的元素中选择一个最小的(或最大的)元素,存放在起始位置,直接排序完成位置。
下面看一个动图:
选择排序的大概过程是什么?
下面拿一个例子说明选择排序的大概过程。
选择排序的基本思想就是:首先选出来最小的数放到最前面,再选出来第二小的数放到最小的数前面,按照前面的方法直到排序完成。
下面来说用选择排序对3,1,5,2,4进行排序(从小到大排序)
- 首先用一个变量minx记录3的下标,拿着minx对应的数字3和第二个数字1比较,发现1小,那数字1的下标存入minx中。
- 继续拿着minx的数字1和第三个数字5进行比较,发现5大于1,不做处理。
- 继续拿着minx的数字1和第四个数字2进行比较,发现2大于1,不做处理。
- 继续拿着minx的数字1和第五个数字4进行比较,发现4大于1,不做处理。
- 截止到现在为止,已经找到了最小数的下标minx,让这组数的第一个数和这个minx对应下标的值进行交换即可,这样就把最小的数放到了第一个位置,这时候这组数据变成了1,3,5,2,4.
- 下面开始第二轮,寻找剩余元素的最小数。
- 首先把第二个数的下标存入minx,拿着minx的数字3和第三个数字5进行比较,发现5大于3,不做处理。
- 继续拿着minx的数字3和第四个数字2进行比较,发现3大于2,那就把3的下标存入到minx中。
- 继续拿着minx的数字2和第五个数字4进行比较,发现4大于2,不做处理。
- 截止到现在为止,已经找到了最小数的下标minx,让这组数的第二个数和这个minx对应下标的值进行交换即可,这样就把最小的数放到了第二个位置,这时候这组数据变成了1,2,5,3,4。
- 下面继续重复上面的操作即可。
总结:选择排序是每次找到一个最小的数,放到前面,假如有n个元素需要排序,那么只需要n-1轮查找即可,因为最后一个数不处理,也会把最大的数剩余到最后面。而且每轮的查找次数也是有规律的,比如第 i 轮查找,只要比比较n-i-1次即可(重要★★★)
怎样用代码实现选择排序?
通过上面对3,1,5,2,4的排序过程讲解,我们需要明确已知的三个条件
- 我们要排序的数组有哪些数?数组长度为多少?
- 我们要查找的次数为多少?
- 每次查找,我们需要比较的次数为多少?
搞清楚了上面三个条件,我们下面我们动图数据排序的实现代码:
#include<iostream> using namespace std; //选择排序函数 不稳定 void SelectionSort(int arr[],int len) { int temp; for(int i=0;i<len-1;i++) { int minx=i; for(int j=i+1;j<len;j++) { if(arr[j]<arr[minx]) //寻找最小的数 minx=j; //记录对应的下标 } temp=arr[i]; arr[i]=arr[minx]; arr[minx]=temp; } } //输出数组的值 void printf(int arr[],int len) { for(int i=0;i<len;i++) cout<<arr[i]<<" "; cout<<endl; } int main() { //要排序的数组 int arr[]={3, 44,38, 5,47,15,36,26,27,2 ,46,4 ,19,50,48}; int len=15;//要排序的数组长度 //排序 SelectionSort(arr,len); //输出 printf(arr,len); return 0; }
运行结果:
选择排序的代码详解
上面代码写了两个函数,一个是printf函数,这个是输出排序后的数组。
另一个函数就SelectionSort函数,在这个函数里面有一个二重循环,外层循环的的次数就是要查找的次数,内层循环的次数的就是要比较的次数,刚好对应上面说的(这里数组下标是从0开始的)。
如果对上面代码有疑问,自己可以按照前面的过程,模拟一边对3,1,4,5,2的排序过程,就知道代码是怎样执行的了 。本文参考以及引用: