排序算法之选择排序

选择排序的主要思想是从待排序的一组数中选择最小(或最大)的一个数与第1个位置交换,然后在剩余的数中再选择最小的数与第2个位置交换,依次类推。

选择排序的时间复杂度最好为O(n), 最坏为O(n2), 平均时间复杂度为O(n2)。

选择排序是一种不稳定的排序算法。

举个栗子:

原数组为: 89 37 23 4 54 17 49 , 数组长度为7,需要进行的排序次数为7-1=6次。

第一次排序,从数组中选择最小的4与第1个数交换:

前:89 37 23 4 54 17 49

后:4 37 23 89 54 17 49 

第二次排序,从数组中选择最小的17与第2个数交换:
前:4 37 23 89 54 17 49 
后:4 17 23 89 54 37 49 

第三次排序,23已经在第3个位置无需交换:
前:4 17 23 89 54 37 49 
后:4 17 23 89 54 37 49 

第四次排序,从数组中选择最小的37与第4个数交换
前:4 17 23 89 54 37 49 
后:4 17 23 37 54 89 49 

第五次排序,从数组中选择最小的49与第5个数交换

前:4 17 23 37 54 89 49
后:4 17 23 37 49 89 54 

第六次排序,从数组中选择最小的54与第6个数交换

前:4 17 23 37 49 89 54
后:4 17 23 37 49 54 89 

最终排序为: 17 23 37 49 54 89

C:

//选择排序, 按从小到大排序
void selection_sort(int array[], int len) {

    for(int i=0; i<len-1; i++) { //需要重复选择最小数的次数
        int index = i; //将最小数的索引标记为当前需要排序的索引
        for(int j=i+1; j<len; j++) { //从当前排序索引的后面找最小数
            if(array[index] > array[j]) { //如果最小数索引指向的最小数大于当前的数
                index = j;  //将当前最小数的索引标记为当前数的索引
            }
        }

        if(i != index) { //当前交换的次数与最小索引不一致,交换两者的数据
            int temp = array[i]; 
            array[i] = array[index]; 
            array[index] = temp; 
        }
    }
}

PHP:

function selectionSort(array $array) {
    $len = count($array);

    for($i=0; $i < $len-1; $i++) {
        $index = $i;
        for($j=$i+1; $j < $len; $j++) {
            if($array[$index] > $array[$j]) {
                $index = $j;
            }
        }

        if($index != $i) {
            $temp = $array[$i];
            $array[$i] = $array[$index];
            $array[$index] = $temp;
        }
    }
}

Python:

def selectionSort(array=None)://array是list类型
    if array is None:
        return

    length = len(array)
    for i in range(length -1):
        index = i
        for j in range(i+1, length):
            if array[index] > array[j]:
                index = j

        if index != i:
            array[i], array[index] = array[index], array[i]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值