美文网首页ios
iOS算法篇(二)选择排序算法

iOS算法篇(二)选择排序算法

作者: LeafRead | 来源:发表于2016-07-13 16:43 被阅读227次

    经典排序算法 - 选择排序Selection sort

    顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,

    顺序放入新数组,直到全部拿完

    再简单点,对着一群数组说,你们谁最小出列,站到最后边

    然后继续对剩余的无序数组说,你们谁最小出列,站到最后边

    再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大

    效率稍高一些的排序【选择排序】

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中 继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

    选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其 最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

    简要的说就是先取出或假设一个最小或最大的数,之后在剩下的数里挑选一个最小或最大的,再和我们认为的最小或最大的数比较。满足条件就交换位置

    举例

    先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9]

    第一趟找到最小数1,放到最前边(与首位数字交换)

    交换前:| 6 | 2 | 4 | 1 | 5 | 9 |

    交换后:| 1 | 2 | 4 | 6 | 5 | 9 |

    第二趟找到余下数字[2 4 6 5 9]里的最小数2,与当前数组的首位数字进行交换,实际没有交换,本来就在首位

    交换前:| 1 | 2 | 4 | 6 | 5 | 9 |

    交换后:| 1 | 2 | 4 | 6 | 5 | 9 |

    第三趟继续找到剩余[4 6 5 9]数字里的最小数4,实际没有交换,4待首位置无须交换

    第四趟从剩余的[6 5 9]里找到最小数5,与首位数字6交换位置

    交换前:| 1 | 2 | 4 | 6 | 5 | 9 |

    交换后:| 1 | 2 | 4 | 5 | 6 | 9 |

    第五趟从剩余的[6 9]里找到最小数6,发现它待在正确的位置,没有交换

    排序完毕输出正确结果[1 2 4 5 6 9]

    第一趟找到最小数1的细节

    当前数组是| 6 | 2 | 4 | 1 | 5 | 9 |

    先把6取出来,让它扮演最小数

    当前最小数6与其它数一一进行比较,发现更小数就交换角色

    当前最小数6与2比较,发现更小数,交换角色,此时最小数是2,接下来2与剩余数字比较

    当前最小数2与4比较,不动

    当前最小数2与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较

    当前最小数1与5比较,不动

    当前最小数1与9比较,不动,到达末尾

    当前最小数1与当前首位数字进行位置交换,如下所示

    交换前:| 6 | 2 | 4 | 1 | 5 | 9 |

    交换后:| 1 | 2 | 4 | 6 | 5 | 9 |

    完成一趟排序,其余步骤类似

    代码仅供参考

    复制代码

    static void selection_sort(int[] unsorted)

    {

    for (int i = 0;  i < unsorted.Length-1; i++)//1、外层循环的结束条件不妥,因为循环排序到最后一个就是最大/小值了,不需要在进行比较,所以应该去除

    {

    int min = unsorted[i], min_index = i;

    for (int int j = i+1; j < unsorted.Length; j++)//2、内层循环的初始条件不妥,如果从i开始就是和自身进行比较了,多余

    {

    if (unsorted[j] < min)

    {

    min = unsorted[j];

    min_index = j;

    }

    }

    if (min_index != i)

    {

    int temp = unsorted[i];

    unsorted[i] = unsorted[min_index];

    unsorted[min_index] = temp;

    }

    }

    }

    static void Main(string[] args)

    {

    int[] x = { 6, 2, 4, 1, 5, 9 };

    selection_sort(x);

    foreach (var item in x)

    {

    Console.WriteLine(item);

    }

    Console.ReadLine();

    }

    排序法  最差时间分析 平均时间复杂度 稳定度 空间复杂度

    选择排序 O(n2) O(n2) 稳定 O(1)

    相关文章

      网友评论

        本文标题:iOS算法篇(二)选择排序算法

        本文链接:https://www.haomeiwen.com/subject/wmzsjttx.html