简单选择排序及其改进算法
来源:互联网 发布:houdini编程 编辑:程序博客网 时间:2024/06/06 00:44
选择排序是一种最为直观的简单排序方法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
算法思路:
(1)从待排序序列中,找到关键字最小的元素;
(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。
简单排序算法代码:
void SelectSort(int num[],int n){ for(int i=0; i<n; i++) { int min=i; for(int j=i+1; j<n; j++) { if(num[min]>num[j])//从剩下的元素选择一个最小的元素 min=j; } if(min != i)//如果最小元素不是无序组起始位置元素,则与起始元素交换位置 { int tmp = num[min]; num[min] = num[i]; num[i] = tmp; } }}
经典简单选择排序算法是不稳定的。假设:将以下序列从小到大排序,3,3*,3**,2(当中,*用来区分关键字相同的不同记录)。按照经典的简单选择排序,当i=1执行第一次循环时,最小记录为最后一条记录2,它对应的下标min取值为4。此时,将 num[1]与num[4]互换得2,3*,3**,3。第二趟和第三趟选择排序不发生任何交换。因此,最后所得有序序列仍然为2,3*,3**,3,所以该简单排序算法不稳定。
下面提出改进算法:
为了保证简单选择排序的稳定性,本文方法基本思路如下:找到最小记录 R[min]后,不将该元素与无序快首记录(即第i条记录)直接交换,而在第i+1条记录到最小记录之间寻找与R[i]关键字相等的记录。每找到一条就将它与R[i]互换。如此,最多经过n-i次交换,R[i]就成为min之前、离min最近的与无序块首记录关键字相等的记录,而其它记录的相对顺序不发生改变。此时再将R[i]与R[min]交换,则排序算法将保持稳定性。
代码如下:
void SelectSort(int num[],int n){ for(int i=1;i<=n-1;i++) { min=i; for(int j=i+1;j<=n;j++) { if(num[min]>num[j]) { min=j; } } if(min!=i) { int temp; for(int k=i+1;k<min;k++) { if(num[k]==num[i]) { temp=num[k]; num[k]=num[i]; num[i]=temp; } } temp=num[i]; num[i]=num[min]; num[min]=temp; } }}
阅读全文
0 0
- 简单选择排序及其改进算法
- 简单选择排序及其改进算法
- 排序算法--选择+冒泡及其改进
- 改进排序算法:堆排序(对简单选择排序的改进)
- 冒泡排序及其改进算法
- 冒泡排序及其改进算法
- 冒泡排序及其改进算法
- 冒泡排序及其改进算法
- 冒泡、插入、选择排序及其改进
- 冒泡、插入、选择排序及其改进
- 排序算法之插入排序及其改进
- 排序算法之冒泡排序及其改进
- 快速排序算法及其改进算法实现
- 堆排序算法(选择排序改进)
- 快速排序及其改进算法C++实现
- 简单选择排序(与改进)
- 第十五周算法改进(选择排序)
- 算法:简单选择排序
- c#快捷键
- 微信公号开发获得用户信息失败
- 结构体指针作函数的参数
- SSM项目之---淘淘商城(第三天)
- Android Studio 3.0 在xml中使用字体文件问题
- 简单选择排序及其改进算法
- 依赖
- 世界各个地区WIFI 2.4G及5G信道一览表
- 6.8
- Java三大要素
- 增加+删除+批量删除+修改+查询+排序+全选
- mariadb
- java并发编程实战:取消与关闭笔记
- Django将数据库改为MySQL