排序——选择排序
来源:互联网 发布:七天网络学生空间登录 编辑:程序博客网 时间:2024/06/05 23:01
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
程序流程:
第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;
第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;
以此类推.....
程序流程:
第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;
第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;
以此类推.....
第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,直到整个序列按关键码有序。
程序如下:
#include <iostream>using namespace std; void print(int a[], int n ,int i) /*打印出当前数组中的值*/{ int j;cout<<"第"<<i+1 <<"次 : "; for(j= 0; j<8; j++){ cout<<a[j] <<" "; } cout<<endl; } void select_sort(int a[], int n){ int tmp, i;int index, min_index; for(i=0; i < n; ++i) /*选择每次应该放在下标为i的单元的数*/ { for(index=i, min_index=i; index < n; index++) /*找出从当前i到数组末尾的最小值*/{if(a[index] < a[min_index])min_index = index;} if(min_index != i) /*如果查找到下标不是起始下标,做交换*/{ tmp = a[i]; a[i] = a[min_index]; a[min_index] = tmp; } print(a, n , i); /*打印出这步进行完的结果*/ } } int main(){ int a[8] = {3, 1, 5, 7, 2, 4, 8, 6}; cout<<"初始值:"; for(int j= 0; j < 8; j++){ cout<<a[j] <<" "; } cout<<endl<<endl; select_sort(a, sizeof(a)/sizeof(int)); return 0;}程序运行结果:
选择排序的特点:
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:不稳定,举个简单的例子来说明一下,有序列3, 3, 4, 1, 5使用选择排序实现排序,那么首先位置1的3就会和位置4的1进行交换,那么原来位置1和位置2的两个3的相对位置就发生了变化,这种情况就可能导致最终两个3的前后位置发生了变化。
分析:这个排序的过程每次只选取了最大或最小值中的一个,为了提高效率,我们可以每次选择出最大和最小的值并分别放在序列的头部和尾部,这样实现排序更优于上面的作法。这样实现的代码和运行结果如下所示:
#include <iostream>using namespace std; void print(int a[], int n ,int i) /*打印出当前数组中的值*/{ int j;cout<<"第"<<i+1<<"次: "; for(j= 0; j<n; j++){ cout<<a[j] <<" "; } cout<<endl; } void select_sort(int a[], int n){ int tmp1, tmp2, i, j;int index, min_index, max_index; for(i=0; i < n/2; ++i){ for(index=i, min_index=i, max_index=n-1-i; index < n-i; index++) /*找出从当前i到数组末尾的最小值和最小值*/{if(a[index] < a[min_index])min_index = index;if(a[index] > a[max_index])max_index = index;} if(min_index != i) /*如果查找到下标不是起始下标,做交换*/ /*第一个数的交换不会出现问题*/{ tmp1 = a[i]; a[i] = a[min_index]; a[min_index] = tmp1; }if(max_index != n-i-1) /*第二步的交换如果需要交换的坐标是i就会出问题*/ /*因为此刻i处的值可能已经改变*/{if(max_index != i){tmp2 = a[n-1-i];a[n-1-i] = a[max_index];a[max_index] = tmp2;}else{a[n-1-i] = tmp1;}} print(a, n , i); /*打印出这步进行完的结果*/ } } int main(){ int a[] = {3, 1, 5, 7, 2, 4, 8, 6, 9}; cout<<"初始值:"; for(int j= 0; j < sizeof(a)/sizeof(int); j++){ cout<<a[j] <<" "; } cout<<endl<<endl; select_sort(a, sizeof(a)/sizeof(int)); return 0;}程序运行结果截图:
注意:同时找出最大值和最小值的方法,在做交换的时候尤其需要注意,因为交换的时候如果两个交换有交叉的话容易出错,详见程序中的注释。
1 0
- 排序—选择排序
- 排序—选择排序
- 排序——选择排序
- 排序——选择排序
- 排序——选择排序
- 排序——选择排序
- 排序——选择排序
- 排序——选择排序
- 排序——选择排序
- 选择排序—堆排序
- 选择排序—堆排序
- 排序算法—选择排序
- 选择排序——直接选择排序
- 选择排序——简单选择排序
- 选择排序——简单选择排序
- 选择排序——简单选择排序
- 选择排序——简单选择排序
- 选择排序—简单选择排序
- writeexcel gem 中的合并格式的问题的解决
- Http请求分析
- 怎样复制百度文库中的内容?
- 3-iOS开发 C语言基础教程 选择分支
- ios strong和weak
- 排序——选择排序
- cocos2dx3.2 学习笔记(3)--ActionsEaseTest(2)
- Sessions, Desktops and Windows Stations
- Java中的类,成员变量的值,在声明的时候直接赋值与在构造函数中再赋值,这个是无所谓的,还是有什么规矩?
- Objective-C 基本语法:实例变量与成员变量的区别
- IOS 点击空白处隐藏键盘的几种方法
- Call requires API level 16 (current min is 14): android.view.View#announceForAccessibility问题解决
- leetcode Binary Tree Postorder Traversal
- 堆排序