【算法】选择排序(从小到大) 排序范围(0~n-1) n为数组元素个数
来源:互联网 发布:android 应用启动优化 编辑:程序博客网 时间:2024/05/20 22:40
开始之前,哎~数构我也是因为考研才真正接触的,不得不说,数组下标真的好晕,0和1之差,虽然核心的思想是知道的,但是,发现代码跟参考书上不一样,那种感受啊。。。以后博文我还是标上排序范围吧,免得自己乱。
今天我们就来谈谈排序算法中的简单排序算法之----选择排序
选择排序的算法思路也很简单,我们只需要在排序范围(begin,end)中选择一个最小的值,然后将其与排序范围中的第一个元素交换,如此循环往复即可。
在选择排序中,我们将指向数组最后一个元素的指针(end)保持不动,从头开始移动begin指针的位置,来逐渐缩小排序范围。
接下来就是算法的执行流程分析了,数据依然是1 3 2 8 0 6 总共6个数
1、第一趟排序,排序范围(0,5),其中的最小值为0,于是我们将元素0与begin指针所指向的元素1进行交换
2、第二趟排序,排序范围(1,5),其中的最小值为1,于是我们将元素1与begin指针所指向的元素3进行交换
3、第三趟排序,排序范围(2,5),其中的最小值为2,可以发现不用交换,其实是2元素自己交换自己(最小值位置与begin指针所在位置重合)
4、第四趟排序,排序范围(3,5),其中的最小值为3,于是我们将元素3与begin指针所指向的元素8进行交换
5、第五趟排序,排序范围(4,5),其中的最小值为6,于是我们将元素6与begin指针所指向的元素8进行交换
6、最终排序结果
我们可以发现,6个数的数组,进行了5次排序,根据算法执行过程分析,我们可以感觉到,选择排序要有两个模块构成,一个用于寻找待排序范围中的最小值,并进行数据交换;另外一个用于遍历,调用前面说的最小值函数。所以,我们可以得到如下选择排序的程序。
//寻找最小值,并把找到的最小值与排序范围的第一个元素进行交换void select(Elemtype a[] , int begin , int end){int i;//初始化时最小值位置为起始位置int minPos = begin;//初始化时最小值为待排序数组的第一个元素Elemtype min = a[begin];//寻找最小值for(i = begin ; i <= end ; i++){if(a[i] < min){minPos = i;min = a[i];}}//将最小值元素与待排序数组头元素进行交换swap(&a[begin],&a[minPos]);}void sort(Elemtype a[] , int begin , int end){int i;for(i = begin ; i <= end ; i++){select(a,i,end);}}
完整可执行程序代码如下:
#include <stdio.h>#define Elemtype intvoid swap(Elemtype *a , Elemtype *b);//寻找最小值,并把找到的最小值与排序范围的第一个元素进行交换void select(Elemtype a[] , int begin , int end){int i;//初始化时最小值位置为起始位置int minPos = begin;//初始化时最小值为待排序数组的第一个元素Elemtype min = a[begin];//寻找最小值for(i = begin ; i <= end ; i++){if(a[i] < min){minPos = i;min = a[i];}}//将最小值元素与待排序数组头元素进行交换swap(&a[begin],&a[minPos]);}void sort(Elemtype a[] , int begin , int end){int i;for(i = begin ; i <= end ; i++){select(a,i,end);}}void display(Elemtype a[] , int begin , int end){int i;for(i = begin ; i < end ; i++){printf("%d ",a[i]);}printf("\n");}void swap(Elemtype *a , Elemtype *b){Elemtype t = *a;*a = *b;*b = t;}int main(){Elemtype a[] = {1,2,3,8,0,6};printf("排序前:\n");display(a,0,6);sort(a,0,5);printf("排序后:\n");display(a,0,6);}
程序运行效果如下
选择排序算法的时间复杂度为O(n^2)
- 【算法】选择排序(从小到大) 排序范围(0~n-1) n为数组元素个数
- 【算法】插入排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 【算法】冒泡排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 【算法】快速排序算法(递归实现 从小到大排列) 排序范围(0~n-1) n为数组元素个数
- n个数从小到大排序(n<5)
- 排序0-n^k-1范围内的n个数,要求时间复杂度为线性
- 1~n无序数组时间复杂度为O(n)排序
- 1~n无序数组时间复杂度为O(n)排序
- 找出数组从小到大的前N个数
- 用Java实现单链表---输入n个数,用单链表(任意算法)对其进行排序并按从小到大顺序输出。
- 算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序
- 算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序 .
- 算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序
- 算法导论8.3-4 O(n)时间内对[0..n^-1]之间的n个数排序
- N个数排序
- n个数的排序
- n个数的排序
- n 个数的排序
- usb中的endpoint(端点)和传输模式
- 51单片机特殊功能寄存器(SFR)介绍
- 中央巡視組進駐北京大學,袁萌為何鳴冤叫屈?
- 基于飞思卡尔微控制器的CAN Bootloader的实现与应用
- DDN(数字数据网)
- 【算法】选择排序(从小到大) 排序范围(0~n-1) n为数组元素个数
- 关于一个程序的“开始——暂停——继续”的一个问题
- linux之学习live555视频笔记
- 玩转飞思卡尔在线调试工具FreeMaster
- kinetis时钟模块MCG详解
- [解析]BeeGFS将是高性能计算领域的一匹黑马
- 小象学院_Python数据分析_第三讲_Pandas
- 深度安卓恶意软件检测系统:用卷积神经网络保护你的手机
- 如何在STM32F10x_StdPeriph_Template基础上建立自己的MDK工程