C/Python实现直接选择排序
来源:互联网 发布:沙发什么意思网络语言 编辑:程序博客网 时间:2024/06/08 02:22
C语言版本
#include<stdio.h>void selection_sort(int arr[], int n);int main(){ int arr[] = {5,6,3,7,4}; int n = sizeof(arr)/sizeof(arr[0]); selection_sort(arr,n); int k; for(k=0;k<n;k++){ printf("第%d个数为%d\n",k+1,arr[k]); } return 0;}void selection_sort(int arr[], int n){ int i,j,k; for(i=0;i<n;i++){ k = -1; int m = arr[i]; for(j=i;j<n;j++){ if(arr[j] < m){ m = arr[j]; k = j; } } if(k!=-1){ arr[k] = arr[i]; arr[i] = m; } }}
python版本
def selection_sort(arr): n = len(arr) for j in range(0,n): k = -1; m = arr[j] for i in range(j+1,n): if arr[i] < m: m = arr[i] k = i if k != -1: arr[k] = arr[j] arr[j] = m return arrtest1 = [3,1,2,5,4]test2 = [1,2,3,4,5]test3 = [5,4,3,2,1]test4 = [1,1,1,1,1]testlist = [test1,test2,test3,test4]for i in testlist: print(selection_sort(i))# print(selection_sort(test3))
一些想法
快速选择排序说到底真的是个很实诚很好理解的排序方法。
第一轮找遍整个数组,找出最小的数,放到最左边。
第二轮找第二个数开始的整个数组,找到最小的数放到第二个位置。
……
因为想法是找到之后放到最左边的位置,所以最左边的位置的数一上来就要保存到一个变量里。不妨先假定那个数就是剩下的数里最小的,令其保存在变量min中。min在与之后的数比较,只要碰到比它小的,就把那个更小的值赋给min。这个过程里,数组本身没有数据发生改变,最左边的数也没变过,因此不用考虑要不要保护min的值。最后遍历完后就找到了最小的,这个时候就是要让最小的和最左边的交换位置。而此时min已经保存了最小的值。
所以还有一点就是如果右侧的数确实存在更小的,那一定要同时把这个最小的数的位置给记录下来。因为遍历结束之后,用来作遍历的i无论如何都移动到了最后,不一定指向最小的数的位置。你要进行位置交换,不知道位置怎么行呢?
然后就是把最小的数的位置中赋值为最左边的数的值,而此时这个位置上本来的数已经在min里面了,就可以用min赋值到最那个位置去。
还有一个问题。那就是找最小的数放在最左边,找次最小的数放在第二位……每次要填的位置向右移动一次,标识上一次剩下的数里最小的数的位置的坐标就应当初始化,否则的话就被再度调用。
这个值可以初始化为-1。如果右侧真得有更小的数,则k就会被赋值那个数的坐标,如果没有,k就是-1。因而交换位置的条件就是k不等于-1,否则也没必要交换啊。
要点
- 有两层循环。第一层:0号位,放入最小的数;1号位,放入次最小的数;……。每一个第一层循环里都有第二曾循环,它把第一层的X号数当做最小,不断和右侧的数比较,找出更小。
- 找到最小的数的时候,要用一个变量存储它的位置。如果那边没有更小的数,就不会给这个变量赋值。
- 这个变量在每一个第一层循环结束,下一个第一层循环开始时要初始化。这个初始化的赋值,不应该是一个合法的数组下标。
- 如果这个变量的值始终没变,说明那个数已经在最左边的位置了,也就不需要做什么。开始下一个第一层循环即可。因此可以以这个变量的数不等于初始值为是否要交换位置的条件。
0 0
- C/Python实现直接选择排序
- C实现单链表直接选择排序
- Python 直接选择排序
- C 直接选择排序
- 用Python实现八大排序算法--直接选择排序
- Python:直接选择排序算法
- Python实现各类数据结构和算法---直接选择排序
- 选择排序----直接选择排序----java实现
- 直接选择排序 C代码
- C语言直接选择排序
- MPI 实现直接选择排序
- 实现直接选择排序算法
- 直接选择排序----java实现
- java实现直接选择排序
- JS实现直接选择排序
- 直接选择排序---JAVA实现
- 直接选择排序java实现
- java实现直接选择排序
- 增强现实设备之Magic Leap & Hololens
- Cache-Control max-age=0
- 关于使用Hibernate出现的多种常见错误的原因及解决办法
- Android去Title和主题Theme使用方法
- pdf格式的文件怎么修改
- C/Python实现直接选择排序
- java 值传递简单透彻理解
- SpringMVC 学习 01 - springmvc在普通类中获取HttpServletRequest对象
- 【Spring专题-⑤】Spring RESTful风格
- TCP/IP学习(2)
- hadoop原生版安装部署---2.zookeeper
- Android System Server大纲之VibratorService
- Android Studio分类整理res/Layout中的布局文件(创建子目录)
- 点击 TextView 弹出 时间设置框 DatePicker 、 DatePickerDialog,用于Sqlite db 获取数据