zoukankan      html  css  js  c++  java
  • 经典排序算法 地精排序Gnome Sort

    经典排序算法 - 地精排序Gnome Sort

    号称最简单的排序算法,只有一层循环,默认情况下前进冒泡,一旦遇到冒泡的情况发生就往回冒,直到把这个数字放好为止

    直接看它排序的过程,待排数组[6 2 4 1 5 9]

    先设计一个标识i=0然后从头开始判断,什么时候(i < 6)不成立,什么时候排序结束,

    所以,如何控制i的值是这个算法的关键

    例如待排数组:

    [6 2 4 1 5 9]

    [0 1 2 3 4 5]

    看一下具体的排序过程

    [ i = 0 ]时啥也不干,先让i自增1,达到值为1才开始真正的比较

    交换前[6 2 4 1 5 9][ i = 0]

    交换后[6 2 4 1 5 9][ i = 1]

    [ i = 1 ]比较6和2,发生交换,只要发生交换i就减1

    交换前[6 2 4 1 5 9][ i = 1]

    交换后[2 6 4 1 5 9][ i = 0]

    [ i = 0 ]又成0了,啥也不干,自增变成1再说

    交换前[2 6 4 1 5 9][ i = 0]

    交换后[2 6 4 1 5 9][ i = 1]

    [ i = 1 ]再比较2和6,不交换,只要不要换就自增1

    交换前[2 6 4 1 5 9][ i = 1]

    交换后[2 6 4 1 5 9][ i = 2]

    [ i = 2 ]比较6和4,发生交换,只要交换就减1

    交换前[2 6 4 1 5 9][ i = 2]

    交换后[2 4 6 1 5 9][ i = 1]

    [ i = 1 ]比较2和4,不交换,只要不交换就自增1

    交换前[2 4 6 1 5 9][ i = 1]

    交换后[2 4 6 1 5 9][ i = 2]

    [ i = 2 ]比较4和6,不交换,只要不交换就自增1

    交换前[2 4 6 1 5 9][ i = 2]

    交换后[2 4 6 1 5 9][ i = 3]

    [ i = 3 ]比较6和1,交换,只要交换就减1

    交换前[2 4 6 1 5 9][ i = 3]

    交换后[2 4 1 6 5 9][ i = 2]

    [ i = 2 ]比较4和1,交换,只要交换就减1

    交换前[2 4 1 6 5 9][ i = 2]

    交换后[2 1 4 6 5 9][ i = 1]

    [ i = 1 ]比较2和1,交换,只要交换就减1

    交换前[2 1 4 6 5 9][ i = 1]

    交换后[1 2 4 6 5 9][ i = 0]

    [ i = 0 ]时啥也不干,先让i自增1,达到值为1才开始真正的比较

    交换前[1 2 4 6 5 9][ i = 0]

    交换后[1 2 4 6 5 9][ i = 1]

    [ i = 1]比较1和2,不交换,只要不交换就自增1

    [ i = 2]比较2和4,不交换,只要不交换就自增1

    [ i = 3]比较4和6,不交换,只要不交换就自增1

    [ i = 4]比较6和5,交换,只要交换就减1

    交换前[1 2 4 6 5 9][ i = 4]

    交换后[1 2 4 5 6 9][ i = 3]

    [ i = 3]比较4和5,不交换,只要不交换就自增1

    [ i = 4]比较5和6,不交换,只要不交换就自增1

    [ i = 5]比较6和9,不交换,只要不交换就自增1

    [ i = 6]表达式(i < n)不成立,排序结束,

    顺序输出结果即可:[ 1 2 4 5 6 9]

    以下代码仅供参考

            static void gnome_sort(int[] unsorted)
            {
                int i = 0;
                while (i < unsorted.Length)
                {
                    if (i == 0 || unsorted[i - 1] <= unsorted[i])
                    {
                        i++;
                    }
                    else
                    {
                        int tmp = unsorted[i];
                        unsorted[i] = unsorted[i - 1];
                        unsorted[i - 1] = tmp;
                        i--;
                    }
                }
            }

    参考http://blog.csdn.net/winark/article/details/5918944



    ------------------------------------------
    除非特别声明,文章均为原创,版权与博客园共有,转载请保留出处
    BUY ME COFFEE
  • 相关阅读:
    Oozie时bin/oozied.sh start或bin/oozied.sh run出现Bootstrap进程无法启动,http://bigdatamaster:11000/oozie界面也无法打开?
    [ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)
    Echoprint系列--Android编译与调用
    shell编程之文本与日志过滤
    C++中搜索、截取字符串
    Swift中的UIKit重力学
    hbase0.96 put流程 源码分析
    [Docker]初次接触
    工作日志2014-08-25
    Flex和Servlet结合上传文件报错(二)
  • 原文地址:https://www.cnblogs.com/kkun/p/gnome_sort.html
Copyright © 2011-2022 走看看