几种排序方法的比较

christ0127 christ0127     2022-07-29     498

关键词:

以下内容参考自鱼C论坛,并进行了修改,原帖【排序技术哪家强,各种排序算法。】http://bbs.fishc.com/thread-56352-1-1.html

 

1. 选择排序。
每次选择最小的一项放到最前面。
效率 : 需要的次数是取决于列表的长度。


2. 冒泡排序。
每两个数比较,互换。每轮选出最大的数放到最顶端。
效率: 因为不会一次性换完,效率最小会是列表长度的平方。(慢。)

改进了两个版本,具体见代码


3. 插入排序。

对于一个确定的数i,统计比i小的数的个数,然后将i插入到该索引位置。
效率: 最差应该是列表长度的平方,但是比冒泡要好(至少我试的是这样)。

插入排序又分两种,一种是直接插入,一种是二分插入,见代码。


4. 快速排序。
从待排序数列中任选一个数,将其余数与之比较,比它大的插到右边,小的插到左边,这样就确定了该数在数列中的位置;然后对左右两边各进行上述方法。
效率: 高,要不怎么叫快速排序~,人品不好也只能是列表长度的平方了。

5.堆排序。
感觉不会用二叉树,所以就不研究这个了,哈哈。

 

6. 归并排序。
就是把两个已经有序的数列合到一起,构成一个新的有序数列。效果图。(代码就不写了)

7. 各个方法比较。

随机生成了5个乱序数组,其长度为10,100,1000,10000,20000。每种方法的执行时间如下,其中buildin是python数组内建的排序方法,尼玛效率怎么这么高?(*注:执行时间已经进行了开50次方,便于作图)

具体的执行时间如下

Buildin      =[0.000003,0.000017,0.000257,0.002901 ,0.006495];
select       =[0.000014,0.000311,0.025999,2.574872 ,10.566038];
bubb         =[0.000019,0.001603,0.168447,17.437580,74.291987];
bubb1       =[0.000014,0.001091,0.105978,11.102826,46.860289];
bubb2       =[0.000012,0.000610,0.062345,6.379967 ,28.134702];
insert        =[0.000010,0.000335,0.029598,3.235186 ,13.360413];
insert_bin =[0.000025,0.000588,0.012024,0.245504 ,0.664790];
fast           =[0.000018,0.000249,0.003099,0.036436 ,0.082707];

 

代码如下:

 

import random
import time

# def Gen_sequence_disorder(a = 0, b = 10 ,num = 10):
#     """generate a series integer num\n(a,b){num}"""
#     seq = []
#     for i in range(num):
#         seq.append(random.randint(a,b))
#     return seq
def Gen_sequence_disorder(a = 0, b = 10 ,num = 10):
    seq = [random.randint(a,b) for i in range(num)]
    return seq

def compare(lsta = [], lstb = []):   #两个列表进行比较,不全等则返回True,用于测试排序算法是否正确
    for i in range(len(lsta)):
        if lsta[i] - lstb[i]:
            return True
    return False

def sel_sort(lst = []):#选择排序,每轮选出待排序中最小的数
    newlist = []
    for i in range(len(lst)):
        newlist.append(min(lst))
        lst.remove(min(lst))
    return newlist

def bubb(lst = []):#冒泡排序,每轮选出最大的数放到最顶端
    for i in range(len(lst)):
        for j in range(len(lst) - 1):
            if lst[j] > lst[j + 1]:
                lst[j], lst[j + 1] = lst[j + 1], lst[j]
    return lst
def bubb_1(lst = []):#冒泡排序改进,每轮选出最大的数放到最顶端,由于每经过一轮后,最顶端的几个数顺序已确定,因此不需要再遍历
    for i in range(len(lst)):
        for j in range(len(lst) - 1 - i):
            if lst[j] > lst[j + 1]:
                lst[j], lst[j + 1] = lst[j + 1], lst[j]
    return lst
def bubb_2(lst = []):#冒泡排序改进,每轮选出最小的数放到最底端,由于每经过一轮后,最底端的几个数顺序已确定,因此不需要再遍历(然而这不是一个稳定的排序方法)
    for i in range(len(lst)):
        for j in range(len(lst) - 1, i, -1):
            if lst[i] > lst[j]:
                lst[i], lst[j] = lst[j], lst[i]
    return lst

def insert(lst = []):#插入排序,对于一个确定的数i,统计比i小的数的个数,然后将i插入到该索引位置
    for i in range(1, len(lst)):
        j = 0
        while lst[i] > lst[j]:
            j += 1
        results = lst[i]
        lst.pop(i)
        lst.insert(j, results)
    return lst
def insert_bin(lst = []):#插入排序,插入的时候使用二分法查找待排序的位置
    def bin_lookup(num, a = 0, b = 1):
        if a < b - 1:
            if num > lst[(a + b) // 2]:
                return bin_lookup(num, (a + b) // 2, b)
            elif num < lst[(a + b) // 2]:
                return bin_lookup(num, 0, (a + b) // 2)
            else:
                return (a + b) // 2
        else:
            if num < lst[a]:
                return a
            else:
                return b
    for i in range(1,len(lst)):
        lst.insert(bin_lookup(lst[i], 0, i), lst[i])
        lst.pop(i + 1)
    return lst

def fast(lst = []):#快速排序
    if len(lst) <= 1:
        return lst
    else:
        temp1 = [i for i in lst[1:] if i < lst[0]]
        temp2 = [i for i in lst[1:] if i >= lst[0]]
        return fast(temp1)+ lst[:1] +fast(temp2)

def heap(lst = []):#堆排序
    pass

def merge(lst = []):#归并排序
    pass

if __name__ == "__main__":
    a, b, c = 0, 500000, 20000
    seq = Gen_sequence_disorder(a, b, c)

    t1 = time.clock()                           #内置排序
    seq_sortedByBuildin = sorted(seq[:])
    t2 = time.clock()
    print('%-25s%f'%('Buildin sort time : ',(t2 - t1)))

    t1 = time.clock()                           #选择排序
    seq_sortedBySel = sel_sort(seq[:])
    t2 = time.clock()
    if compare(seq_sortedBySel, seq_sortedByBuildin):
        print('seq_sortedBySel')
    print('%-25s%f'%('select sort time : ',(t2 - t1)))

    t1 = time.clock()                           #冒泡排序
    seq_sortedBybubb = bubb(seq[:])
    t2 = time.clock()
    if compare(seq_sortedBybubb, seq_sortedByBuildin):
        print('seq_sortedBybubb')
    print('%-25s%f'%('bubb sort time : ',(t2 - t1)))

    t1 = time.clock()                           #冒泡排序1
    seq_sortedBybubb_1 = bubb_1(seq[:])
    t2 = time.clock()
    if compare(seq_sortedBybubb_1, seq_sortedByBuildin):
        print('seq_sortedBybubb_1')
    print('%-25s%f'%('bubb1 sort time : ',(t2 - t1)))

    t1 = time.clock()                           #冒泡排序2
    seq_sortedBybubb_2 = bubb_2(seq[:])
    t2 = time.clock()
    if compare(seq_sortedBybubb_2, seq_sortedByBuildin):
        print('seq_sortedBybubb_2')
    print('%-25s%f'%('bubb2 sort time : ',(t2 - t1)))

    t1 = time.clock()                           #插入排序
    seq_sortedByinsert = insert(seq[:])
    t2 = time.clock()
    if compare(seq_sortedByinsert, seq_sortedByBuildin):
        print('seq_sortedByinsert')
    print('%-25s%f'%('insert sort time : ',(t2 - t1)))
    
    t1 = time.clock()                           #插入排序2
    seq_sortedByinsert_bin = insert_bin(seq[:])
    t2 = time.clock()
    if compare(seq_sortedByinsert_bin, seq_sortedByBuildin):
        print('seq_sortedByinsert_bin')
    print('%-25s%f'%('insert_bin sort time : ',(t2 - t1)))
        
    t1 = time.clock()                           #插入排序2
    seq_sortedByfast = fast(seq[:])
    t2 = time.clock()
    if compare(seq_sortedByfast, seq_sortedByBuildin):
        print('seq_sortedByfast')
    print('%-25s%f'%('fast sort time : ',(t2 - t1)))

  

java中的几种比较器,对象比较,二维数组排序(代码片段)

Java中的几种比较器一般涉及到对象数组的排序时,我们需要比较数组中的对象进行我们想要的排序。情况一对象简单,仅仅只是比较两个引用指向同一个对象,对象的地址是否相同。用“==”即可实现情况二如... 查看详情

java中的几种比较器,对象比较,二维数组排序(代码片段)

Java中的几种比较器一般涉及到对象数组的排序时,我们需要比较数组中的对象进行我们想要的排序。情况一对象简单,仅仅只是比较两个引用指向同一个对象,对象的地址是否相同。用“==”即可实现情况二如... 查看详情

几种排序方法简介

1、快速排序快速排序是,设定一个基准,从两头出发把小于基准的序列统一在左边,大于基准的序列在右边。时间复杂度:平均O(nlogn)2、冒泡排序冒泡排序是,通过和相邻的元素比较,重复遍历。时间复杂度:O(n^2)3、直接选择... 查看详情

java中的几种排序方法

  日常操作中常见的排序方法很多,比如有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。一、冒泡排序  一种简单的排序算法。它重复地走访... 查看详情

java实现几种常见排序方法

  日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。一、冒泡排序  冒泡排序是一种简单的排序算法。它重复地走访... 查看详情

java中有哪几种常用的排序方法?每个排序方法的实现思路是如何的?每个方法的思想是啥??

JAVA中有哪几种常用的排序方法?每个排序方法的实现思路是如何的?每个方法的思想是什么??我自学JAVA中,一直对数组的排序方法很迷茫,不知道解决思路和排序方法的思想是如何的。。上面三个问题请高手一一指教,感激... 查看详情

几种排序算法思想

一、冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],依此... 查看详情

请给出java几种排序方法

请给出java几种排序方法java常见的排序分为:1插入类排序主要就是对于一个已经有序的序列中,插入一个新的记录。它包括:直接插入排序,折半插入排序和希尔排序2交换类排序这类排序的核心就是每次比较都要“交换”,在... 查看详情

几种比较常见的算法排序(代码片段)

归并排序  在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。即输出P%1000000007。1publicclassSolution2in... 查看详情

几种排序算法的比较转自http://blog.csdn.net/keenweiwei/article/details/3697452

1冒泡排序:已知一组无需数据a[1],a[2],a[3],a[4],a[5][a[n],将其按升序排列,首先找出这组数据中最大值,将a[1]与a[2]比较,若a[1]大,则交换两者的值,否则不变,在继续将a[1]与a[3]比较,。。。。最后找出最大值a[n];在用同样的方法... 查看详情

记一下javascript的几种排序算法

零、写在最前  排序的方法有很多种,这篇文章只是记录我熟悉的算法;  我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看!  附上SortAnimate网站链接:http://jun-lu.github.io/S... 查看详情

数组的几种排序

数组排序1、几种重要的排序冒泡排序*比较相邻的元素,如果第一个比第二个大,就交换他们两个。*对每一个相邻元素做同样的工作,从开始第一对到结尾的最后一对,在这一点,最后的元素应该会是最大的数。*针对所有的元... 查看详情

java中常见的几种数组排序方法(代码片段)

这篇文章总结一下我学习到的几种常见的数组排序方法冒泡排序冒泡排序在我看来是最简单、最基本的排序方法,我们应当将冒泡排序的原理和代码熟记于心。冒泡排序的原理十分简单:用数组的第一个元素和第二个元... 查看详情

整数排序的几种方法

网上看到有一位大神总结的代码,先记录如下:````classSolution{public:/**@paramA:anintegerarray*@return:*/voidsortIntegers(vectorprivate://Quicksortintpartition(vectorintpivot=a[(left+right)/2];while(left<=right){//findth 查看详情

几种任务调度的java实现方法与比较

几种任务调度的Java实现方法与比较综观目前的Web应用,多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的Java实现方法,包括Timer,Scheduler,Quartz以及JCronTab,并对其优缺点进行比较,目的在... 查看详情

冒泡排序算法有几种写法?

冒泡排序算法有两种,一种是从大到小排,另一种是从小到大排。 冒泡排序依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需... 查看详情

几种bean的复制方法性能比较

  由于项目对性能速度要求很高,表中的字段也很多,存在一个复制方法,耗时相对比较长,经过测试,使用Apache,Spring等提供的方法耗时较长,使用自己自定义的复制方法时间提升很多,现记录下。1.pom.xml1<projectxmlns="http:... 查看详情

对几种获取字符串长度的方法进行性能比较

...ase6.8(Final)操作环境:vi编辑器任务:对获取字符串长度的几种统计方法的性能比较。测试数据如下:1.变量自带的获取长度的方法[[email protected]scripts]#timefornin{1..10000};dochar=`seq-s"skyboy"100`;echo${#char}&>/dev/null;do 查看详情