关闭

排序算法--浅谈

标签: 排序算法计算机科学插入排序堆排序算法
173人阅读 评论(0) 收藏 举报
分类:

前段时间在看计算机科学科学及编程导论,其中谈到了排序的各种算法,在这我浅谈四种插入,选择,冒泡,以及堆排序。

首先需要知道算法是什么?

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令程序的效率的一部分是由算法的时间复杂度或者是空间复杂度决定。这四种算法我用时间复杂度来分析

插入排序

插入排序一个经典的列子整理扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。



伪代码

list sort_insert(list):
       for i<-len(list) :
           for j <-i:
              if list[i]>list[j]:
                    Exchanging position
return list

代码块:

def insert_sort(sort_list):
    for i in range(len(sort_list)):
        for j in range(i):
            if sort_list[i] > sort_list[j]:
                sort_list[j], sort_list[i] = sort_list[i], sort_list[j]
        print sort_list
    return sort_list

时间复杂度为o(n^2)

测试:

      

sort_list = [8, 3, 4, 2, 6]
insert_sort(sort_list)
结果:
[8, 3, 4, 2, 6]
[8, 3, 4, 2, 6]
[8, 4, 3, 2, 6]
[8, 4, 3, 2, 6]
[8, 6, 4, 3, 2]
<span style="font-size:18px;">选择排序</span>

      是一种简单直观的排序算法。工作原理,首先在未排序序列中找到最小(大)元素,存放在排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素


伪代码

list select_sort(list):
     for i <-range(len(list):
          for j=i+1 <-range(len(list)):
               if list[j]<list[i] 
                 Exchange postion
代码

def select_sort(sort_list):
    for i in range(len(sort_list)):
        for j in range(i+1,len(sort_list)):
            if sort_list[j] < sort_list[i]:
                sort_list[i], sort_list[j] = sort_list[j], sort_list[i]
        print sort_list
    return sort_list
时间复杂度为o(n^2)

测试

sort_list = [8, 3, 4, 56, 6, 1
select_sort(sort_list)
结果:
[1, 8, 4, 56, 6, 3]
[1, 3, 8, 56, 6, 4]
[1, 3, 4, 56, 8, 6]
[1, 3, 4, 6, 56, 8]
[1, 3, 4, 6, 8, 56]
[1, 3, 4, 6, 8, 56]
[1, 3, 4, 6, 8, 56]


冒泡排序

临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换


伪代码 

   

list bubble_list(list):
       for i<-len(list) :
           for j <-range(1,len(list)-i):
              if list[j-1]>list[j]:
                    Exchanging position
return list

代码:

      

def bubble_sort(sort_list):
    for i in range(len(sort_list)):
        for j in range(1,len(sort_list) - i):
            if sort_list[j] < sort_list[j-1]:
                sort_list[j-1], sort_list[j] = sort_list[j], sort_list[j-1]
        print sort_list
    return sort_list

时间复杂度为o(n^2)

测试:

sort_list = [8, 3, 4, 56, 6, 1]
bubble_sort(sort_list)
结果:
[3, 4, 8, 6, 1, 56]
[3, 4, 6, 1, 8, 56]
[3, 4, 1, 6, 8, 56]
[3, 1, 4, 6, 8, 56]
[1, 3, 4, 6, 8, 56]
[1, 3, 4, 6, 8, 56]

堆排序

堆排序利用了堆这种数据结构设计的一种排序算法,分了小堆和大堆,满足子节点总是小于父节点

def heap_sort(list):
    # 创建最大堆
    for start in range((len(list) - 2) // 2, -1, -1):
        sift_down(list, start, len(list) - 1)

    # 堆排序
    for end in range(len(list) - 1, 0, -1):
        list[0], list[end] = list[end], list[0]
        sift_down(list, 0, end - 1)
    return list

# 最大堆调整
def sift_down(lst, start, end):
    root = start
    while True:
        child = 2 * root + 1
        if child > end:
            break
        if child + 1 <= end and lst[child] < lst[child + 1]:
            child += 1
        if lst[root] < lst[child]:
            lst[root], lst[child] = lst[child], lst[root]
            root = child
        else:
            break
时间复杂度为n*log2n


百万级数据上堆排序是相对于其他三个排序更加适合,插入一般不用在数量超过一千的场合下,插入的最好时间复杂度为o(n) 最差为o(n^2) ,而冒泡和选择是对数级增长,一般并不推荐使用 

 

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

nrf24l01工作原理

NRF24L01是Nordic公司研发的一款2.4G通信芯片。
  • sinat_27105435
  • sinat_27105435
  • 2015-09-24 17:39
  • 1860

排序算法整理(6)堆排序的应用,top K 问题

top K问题是这样的,给定一组任意顺序的数,假设有n个。如何尽快地找到它们的前K个最大的数? 首先,既然是找前K个最大的数,那么最直观的办法是,n个数全部都排序,然后挑出前K个最大数。但是这样显然做...
  • feliciafay
  • feliciafay
  • 2013-10-03 12:51
  • 5900

浅谈排序算法实现 (计数排序、基数排序)

1、   计数排序       计数排序是一种高效的线性排序,它通过计算一个集合中元素楚翔的次数来确定集合如何排列,计数排序不需要进行数据的比较,所有他的运行效率前面介绍的都高。       计数...
  • jsh13417
  • jsh13417
  • 2013-03-09 23:39
  • 6916

浅谈直接插入排序算法思想以及时间复杂度分析

研究意义 直接插入排序是最基本的一种排序算法,其思想简单,容易掌握,对后期的学习也有一定的帮助。 必备知识(之后不在累述叙述) 排序:将一组杂乱无章的数据排列成一个按关键字有序的序列。 稳定性:关键...
  • q814507462
  • q814507462
  • 2017-06-13 20:24
  • 501

浅谈排序算法实现 (归并排序)

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。       归并排序是建立在归并...
  • jsh13417
  • jsh13417
  • 2013-03-09 12:09
  • 1905

浅谈算法和数据结构: 二 基本排序算法

本篇开始学习排序算法。排序与我们日常生活中息息相关,比如,我们要从电话簿中找到某个联系人首先会按照姓氏排序、买火车票会按照出发时间或者时长排序、买东西会按照销量或者好评度排序、查找文件会按照修改时间排...
  • qq1175421841
  • qq1175421841
  • 2015-12-15 13:40
  • 189

浅谈算法和数据结构: 二 基本排序算法

本篇开始学习排序算法。排序与我们日常生活中息息相关,比如,我们要从电话簿中找到某个联系人首先会按照姓氏排序、买火车票会按照出发时间或者时长排序、买东西会按照销量或者好评度排序、查找文件会按照修改时间排...
  • u012496929
  • u012496929
  • 2015-08-06 20:40
  • 196

浅谈算法和数据结构: 二 基本排序算法

本篇开始学习排序算法。排序与我们日常生活中息息相关,比如,我们要从电话簿中找到某个联系人首先会按照姓氏排序、买火车票会按照出发时间或者时长排序、买东西会按照销量或者好评度排序、查找文件会按照修改时间排...
  • E01014165
  • E01014165
  • 2016-06-14 17:08
  • 151

浅谈算法和数据结构: 二 基本排序算法

转发请声明转发: 原文在这里:http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 本篇开始学习排序算法。排序与...
  • xingkong_00123
  • xingkong_00123
  • 2017-12-22 16:14
  • 58

浅谈算法和数据结构: 二 基本排序算法

原文地址: http://www.cnblogs.com/yangecnu/p/Introduction-Insertion-and-Selection-and-Shell-Sort.html ...
  • VHeroin
  • VHeroin
  • 2016-12-14 16:40
  • 137
    个人资料
    • 访问:64799次
    • 积分:1053
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:6篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论