基础算法——排序【一】

栏目: 编程工具 · 发布时间: 5年前

内容简介:排序可以说时最基础的算法之一,排序就是将数据按照某种逻辑重新排列的过程,比如从大到小排序、从小到大排序;排序非常常见比如有购物车物品的排序、历史订单的排序等等;算法我们比较关心的主要有两点:算法逻辑上分为已排序未排序两个区间,从当前列表中选择最小的元素与当前列表第一个元素交换位置,从列表剩余元素中找到最小元素与列表第二个元素交换位置如此重复执行的算法为选择排序算法;选择排序与数据的初始状态无关,

排序可以说时最基础的算法之一,排序就是将数据按照某种逻辑重新排列的过程,比如从大到小 排序 、从小到大排序;排序非常常见比如有购物车物品的排序、历史订单的排序等等;算法我们比较关心的主要有两点: 时间复杂度空间复杂度 ,排序算法一样;这篇文章只介绍几种基本的排序算法: 冒泡排序插入排序选择排序

选择排序

算法逻辑上分为已排序未排序两个区间,从当前列表中选择最小的元素与当前列表第一个元素交换位置,从列表剩余元素中找到最小元素与列表第二个元素交换位置如此重复执行的算法为选择排序算法;

选择排序与数据的初始状态无关, 每次查找最小元素值时都会与数组中元素进行交换位置 ,因此选择排序为 非稳定排序算法 ,在各种情况下算法时间复杂度都为O(n2),空间复杂度为O(n);

func SelectionSort(data [] int) {
     n := len(data)
     if n <= 1 {
         return
     }
     for i := 0; i < n; i++ {
         //最小元素索引
         min := i
         for j := i + 1; j < n; j++ {
             if data[j] < data[min] {
                 min = j
             }
         }
         //交换元素,交换后未已排序数据
         data[i], data[min] = data[min], data[i]
     }
 }

插入排序

与选择排序类似在逻辑上列表分为已排序和未排序两个区间,初始时已排序区间未为左边第一个元素, 插入排序的核心为从右边未排序区间中选择元素插入到左边合适的位置 ,直到已排序列表长度等于原始列表长度;插入 排序算法 的关键步骤为元素比较与元素的移动,当从未排序端拿数据插入到已排序端时已排序端可能会存在大量的数据移动;

与选择排序不同的是列表初始状态对插入排序的性能影响很大,当列表初始状态有序度很高时插入排序并不需要大量移动数据,从中可以看出插入排序为原地排序算法、 算法是稳定的

算法最好情况下时间复杂度为:O(n)、平均、最坏复杂度为:O(n2);

func InsertionSort(data [] int) {
          n := len(data)
          for i := 1; i < n; i++ {
              value := data[i]
              //查找插入位置
              var j int
              for j = i - 1; j >= 0; j-- {
                  if data[j] > value {
                      //数据后移
                      data[j+1] = data[j]
                  } else {
                      break
                  }
              }
              data[j+1] = value
          }
 }

冒泡排序

每次比较相邻两个元素是否满足,否则交换相邻两个元素,每次冒泡至少一个元素移动到它所属位置,重复N次完成列表排序;

冒泡操作核心为项链元素交换,空间复杂度为O(1),为原地排序算法; 算法是稳定的 ,最好情况时间复杂度为为O(n),平均与最坏情况时间复杂度为:O(n2);

func BubbleSort(data [] int) {
     n := len(data)
     for i := 0; i < n; i++ {
         //是否有数据交换,用于当某轮中数据已排序时退出循环
         flag := false
         for j := 0; j < n-1-i; j++ {
             if data[j] > data[j+1] {
                 //冒泡
                 data[j], data[j+1] = data[j+1], data[j]
                 flag = true
             }
         }
         if !flag {
             break
         }
     }
      }

基础排序算法特性

基础算法——排序【一】

参考资料: 《算法四》


以上所述就是小编给大家介绍的《基础算法——排序【一】》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人月神话

人月神话

[美] 弗雷德里克·布鲁克斯 / 汪颖 / 清华大学出版社 / 2002-11 / 29.80元

作者为人们管理复杂项目提供了颇具洞察力的见解,既有很多发人深省的观点,也有大量的软件工程实践。书中的内容来自布鲁克斯在IBM公司System 360家族和OS 360中的项目管理经验。初版的20年后,布鲁克斯重新审视了他原先的观点,增加了一些新的想法和建议。新增加的章节包括:原著中一些核心观点的精华;在经过了一个时代以后,Brooks博士对原先观点新的认识;1986年的经典文章《没有银弹》;对19......一起来看看 《人月神话》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具