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
原创粉丝点击