选择排序

2017-12-14  本文已影响12人  无题007
何为选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

n个数的选择排序是一个两重循环的问题:外循环控制求最小值的次数,n个数求最小值,要用n-1次循环;内层循环用来完成求最小值的过程,假定当前元素_array[i]是最小值,假设内循环变量是j(j>=i+1&&j<=n-1) ,让_array[i]与其后的所有元素_array[j]逐个相比较。

 for(NSInteger i = 0; i <  _array.count; i++ ){
        for(NSInteger j = i+1; j < _array.count; j++){
            if(_array[i] > _array[j]){
                [_array exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
    }
改进

虽然上述代码能得到结果,但是还是有缺陷的,对于一个顺序的数组 @[@10,@9,@8,@7,@6,@5,@4,@3,@2,@1]排序的话,元素_array[0]要与后面的每个元素都要比较,这样肯定不行的,那么咱们改进一下:
每次找最小值最多只需要一次交换,即初始位置的元素与最小值元素的交换。这样在找最小值的过程中,就要把最小值的位置标记下来,因此可以定义一个标记变量,来标记本轮比较中最小值的元素,开始假设初始元素最小,将其下标作为标记变量的初始值。然后让后面的所有元素与标记的最小值做比较,如果比最小值还小,只需要更新最小值下标赋值变量。当外层循环结束后,判断标记变量的位置,如果不再指向初始元素,说明最小值不在初始位置,这时,让初始元素与标记变量所标记位置的元素做一次交换,否则不用交换:

for(NSInteger i = 0; i <  _array.count; i++ ){
        NSInteger k = i; //标记变量的初始化,假设初始元素最小
        for(NSInteger j = i+1; j < _array.count; j++){
            if(_array[k] > _array[j]){//如果后面的元素小于最小值,则将其下标赋值给标记变量
                k = j;
            }
        }
        if(k != i){//交换
            [_array exchangeObjectAtIndex:i withObjectAtIndex:k];
        }
    }
上一篇下一篇

猜你喜欢

热点阅读