[golang] 数据结构-地精排序

碎碎念
这是一个名字起得很随便的排序算法,是我我就叫他史莱姆排序ㄟ(▔,▔)ㄏ

原理
地精排序是也是一种交换排序。它只进行一轮比较,在这轮比较中,遇到比较前面元素大就向后移动一位继续比较,遇到比前面值小就和前面的值交换,并向前移动一位。

复杂度
对已经排序号的队列哥布林只需从头走到尾就结束了,所以最好情况时间复杂度就是O(n),平均的时间复杂度也和冒泡排序一样也是O(n^2)。

代码

package main

import (
    "time"
    "fmt"
    "math/rand"
)

func main() {
    var length = 10
    var list []int

    // 以时间戳为种子生成随机数,保证每次运行数据不重复
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    for i := 0; i < length; i++ {
        list = append(list, int(r.Intn(1000)))
    }
    fmt.Println(list)

    gnome := 1
    // 地精从第二个坑位开始向最后一个坑走过去
    for gnome < length {
        // 如果地精发现自己这个坑位的值不比前面一个坑位的小,就继续向下个坑位走过去
        if list[gnome] >= list[gnome-1] {
            gnome++
        } else {
            // 如果比前个坑位值小,就交换两个坑位的值,然后再回到前一个坑位
            list[gnome], list[gnome-1] = list[gnome-1], list[gnome]
            if gnome > 1 {
                gnome--
            }
            fmt.Println(list)
        }
    }

}

运行结果

原文地址:http://blog.51cto.com/13022101/2152368

时间: 2024-11-13 08:20:56

[golang] 数据结构-地精排序的相关文章

[golang] 数据结构-希尔排序

除了上篇介绍的二分插入排序,还有这次介绍的希尔排序(Shell's Sort),也是对直接插入排序算法的优化. 原理希尔排序,就是按某个增量值对数据进行分组,每组单独排序好后,再缩小这个增量,然后按新增量对数据分组后每个分组再各自排序.最终增加缩小到1的时候,排序结束.所以希尔排序又叫缩小增量排序(Diminishing Increment Sort) 关于增量最佳增量值的选择其实是个数学难题,有兴趣的可以自己搜下相关资料.常用的增量有 n/2(这个又叫希尔增量).n/3.2^k-1(hibba

[golang] 数据结构-鸡尾酒排序

吐个槽又是一个不正经取名的排序算法.真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序) 原理鸡尾酒排序(Cocktail Sort)是冒泡排序的一种优化算法.原本的冒泡排序只能在一轮中挑出一个值移动到最后,而鸡尾酒则可以在一轮里挑最大的移到最后,再挑最小的移到最前面.实际上就是先正向进行一轮普通的冒泡排序,然后再逆向进行一轮反向冒泡,每轮冒泡都缩小一点范围. 复杂度最好情况是正序排列的数列O(n),最坏情况是逆序O(n^2),平

数据结构杂谈(二)简单有趣的地精排序Gnome sort

很早之前便听说过地精排序的名字,今天自己看来一下,发现这是一种非常简单而且有趣的排序算法. 为什么叫地精排序? 地精排序在2000年由Dr. Hamid Sarbazi-Azad 提出的时候被称作 stupid sort,可见其思想的简单性.后来,这个算法被Dick Grune 描述成地精排序Gnome sort. 故事背景: Here is how a garden gnome sorts a line of flower pots.  Basically, he looks at the f

《C算法.第1卷,基础、数据结构、排序和搜索(第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <C算法>介绍了当今最重要的算法,共分3卷,<C算法(第1卷):基础.数据结构.排序和摸索>是第1卷.第1卷分4部分.共16章.第一部分"基础知识"(第1-2章)介绍了基本算法分析原理.第二部分"数据结构"(第3-5章)讲解算法分析中必须掌握的数据结构知识.主要包括基本数据结构.抽象数据结构.递归和树.第三部分"排序"(第6-11章)按章节顺序分别讨论了基本排序方法(

数据结构-各类排序算法总结[结局]

各类排序算法总结 五.分配类排序->基数排序: 基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成"多关键码"进行排序的方法.基数排序属于"低位优先"排序法,通过反复进行分配与收集操作完成排序. 对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字, 此时可以采用这种"分配-收集"的办法进行排序,称作基数排序法.其好处是不需要进行关键字间的比较. 例如:对下列这组关键字{278, 109, 063, 930

数据结构之排序

1.排序的分类 在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的:若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的. 稳定的排序 时间复杂度 空间复杂度 冒泡排序 最差和平均是O(n2),最好是O(n)    1  双向冒泡排序 最差和平均是O(n2),最好是O(n)  1 插入排序 最差和平均是O(n2),最好是O(n)   1 归并排序  最差.平均.最好都是O(nlogn) O(n)  桶排序

Java数据结构与排序

一.引子:想要给ArrayList排序却发现没有排序方法?你有两种选择:        1.换用TreeSet:     2.使用Collection.sort(List<T> list) / Collection.sort(List<T> list, Comparator<? super T> c)方法. 二.展开分析Java的几种主要数据结构及其排序方法: LinkedList 高效操作元素 TreeSet  不重复,有序 HashSet 不重复,快速查找 Hash

数据结构-各类排序算法总结[续]

各类排序算法总结 三.交换类排序[接上] 2.快速排序 快速排序是通过比较关键码.交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分.其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码.我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分.对各部分不断划分,直到整个序列按关键码有序. 如果每次划分对一个元素定位后,该元素的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况! [算法

数据结构—各类‘排序算法’实现(上)

数据结构中的排序算法分为比较排序,非比较排序.比较排序有插入排序.选择排序.交换排序.归并排序,非比较排序有计数排序.基数排序.下面是排序的具体分类: 1.直接排序 主要思想:使用两个指针,让一个指针从开始,另一个指针指向前一个指针的+1位置,两个数据进行比较 void InsertSort(int* a, size_t size) {      assert(a);      for (size_t i = 0; i < size - 1; i++)      {           int