vlambda博客
学习文章列表

带你图解排序算法之—— 选择排序算法(三)


01

引言

Introduction

只要涉及到数据,就会涉及到数据的排序问题,比如给你随机给你五个整数  3,1,2,5,4。让你从小到大进行排序,那我们该怎样才是实现对这些整数的排序呢 ?

答案是多种多样的,比如用 冒泡排序 选择排序 、堆排序、归并排序、 快速排序 等等,这些排序方法都可以实现对整数排序,而这篇文章要讲的就是 选择排序
本文将从以下几个问题对选择排序进行分析和讲解:

 1   选择 排序的算法思想及其大概过程怎样的?

 2    怎样用代码实现快速排序?

 3    快速 排序的代码详解



02

 选择排序的思想和过程 

The idea and process of selcet sort

算法思想

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

简单来说:选择排序就是经过一轮一轮的查找,每一轮都从待排序的元素中选择一个最小的(或最大的)元素,存放在起始位置,直接排序完成位置。


带你图解排序算法之—— 选择排序算法(三)



算法过程:


  下面来说用选择排序对3,1,5,2,4进行排序(从小到大排序)


 1   首先用一个变量minx记录3的下标,拿着minx对应的数字3和第二个数字1比较,发现1小,那数字1的下标存入minx中。

 2   继续拿着minx的数字1和第三个数字5进行比较,发现5大于1,不做处理。

 3   继续拿着minx的数字1和第四个数字2进行比较,发现2大于1,不做处理。

 4   继续拿着minx的数字1和第五个数字4进行比较,发现4大于1,不做处理。

 5   截止到现在为止,已经找到了最小数的下标minx,让这组数的第一个数和这个minx对应下标的值进行交换即可,这样就把最小的数放到了第一个位置,这时候这组数据变成了1,3,5,2,4

 6   下面开始第二轮,寻找剩余元素的最小数。

 7   首先把第二个数的下标存入minx,拿着minx的数字3和第三个数字5进行比较,发现5大于3,不做处理

 8   继续拿着minx的数字3和第四个数字2进行比较,发现3大于2,那就把3的下标存入到minx中

 9   继续拿着minx的数字2和第五个数字4进行比较,发现4大于2,不做处理。

  10    截止到现在为止,已经找到了最小数的下标minx,让这组数的第二个数和这个minx对应下标的值进行交换即可,这样就把最小的数放到了第二个位置,这时候这组数据变成了12,5,3,4。

  11    下面继续重复上面的操作即可。



03

 怎样用代码实现选择排序 

How to implement select sort in code


通过上面对3,1,5,2,4的排序过程讲解,我们需要明确已知的三个条件:

 1    我们要排序的数组有哪些数?数组长度为多少?

 2     我们要查找的次数为多少

 3    每次查找,我们需要比较的次数为多少?

#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;}


带你图解排序算法之—— 选择排序算法(三)



 往期推荐 

🔗

🔗