zoukankan      html  css  js  c++  java
  • 快速排序

    1.分治思想快速排序

    https://www.cnblogs.com/feichangnice/p/5334195.html

    算法导论上的快速排序采用分治算法,步骤如下:

    1.选取一个数字作为基准,可选取末位数字

    2.将数列第一位开始,依次与此数字比较,如果小于此数,将小数交换到左边,最后达到小于基准数的在左边,大于基准数的在右边,分为两个数组

    3.分别对两个数组重复上述步骤

    其中一次排序步骤如下:

    伪码实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    QuickSort(A,p,r)
        if p<r
            then q = Partition(A,p,r)
                QucikSort(A,p,q-1)
                QucikSort(A,q+1,r)
     
    Partition(A,p,r)
        x=A[r]
        i=p-1
        for j from p to r-1
            if A[j]<=x
                then i=i+1
                    exchange A[i],A[j]
        exchange A[i+1],A[r]
        return i+1

      

    Python实现代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    def QuickSort(arr,firstIndex,lastIndex):
        if firstIndex<lastIndex:
            divIndex=Partition(arr,firstIndex,lastIndex)
     
            QuickSort(arr,firstIndex,divIndex)       
            QuickSort(arr,divIndex+1,lastIndex)
        else:
            return
     
     
    def Partition(arr,firstIndex,lastIndex):
        i=firstIndex-1
        for j in range(firstIndex,lastIndex):
            if arr[j]<=arr[lastIndex]:
                i=i+1
                arr[i],arr[j]=arr[j],arr[i]
        arr[i+1],arr[lastIndex]=arr[lastIndex],arr[i+1]
        return i
     
     
    arr=[1,4,7,1,5,5,3,85,34,75,23,75,2,0]
     
    print("initial array: ",arr)
    QuickSort(arr,0,len(arr)-1)
    print("result array: ",arr)

      运行结果如下:

    initial array:
    [1, 4, 7, 1, 5, 5, 3, 85, 34, 75, 23, 75, 2, 0]
    result array:
    [0, 1, 1, 2, 3, 4, 5, 5, 7, 23, 34, 75, 75, 85]

    性能分析以后做

    =============

    2.冒泡排序

    实现思路 : 使用双重for循环,内层变量为i, 外层为j,在内层循环中不断的比较相邻的两个值(i, i+1)的大小,如果i+1的值大于i的值,交换两者位置,每循环一次,外层的j增加1,等到j等于n-1的时候,结束循环
    第一次看不懂很正常,不要灰心,下面是使用代码的实现

    arr = [7, 4, 3, 67, 34, 1, 8]

    def bubble_sort(arr):
        n = len(arr)
        for j in range(0, n - 1):
            for i in range(0, n - 1 - j):
                if arr[i] > arr[i + 1]:
                    arr[i], arr[i + 1] = arr[i + 1], arr[i]


    bubble_sort(arr)
    print(arr)  # [1, 3, 4, 7, 8, 34, 67]
    ---------------------  
    作者:东都花神  
    来源:CSDN  
    原文:https://blog.csdn.net/qq_33988065/article/details/79636021  
    版权声明:本文为博主原创文章,转载请附上博文链接!

    =================================

    3.桶排序

    https://www.cnblogs.com/king-ding/p/bucketsort.html

    问题提出:

    将以下数据:

    6, 8, 2, 3, 4, 0, 9, 1, 5,1

    按从小到达排列。


    桶排序原理:

    桶排序也叫计数排序,简单来说,就是将数据集里面所有元素按顺序列举出来,然后统计元素出现的次数。最后按顺序输出数据集里面的元素。

    排序过程如下:

    一、初始化桶的大小

    把数据集里面每一个元素当作一个桶,由上面问题看出,原始数据范围在0--9之间,因此我就需要有10个桶,如下图

    第一行为初始化计数为0,第二行为各个元素。

    二、计数

    接下来读入第一原始数据为6,则在下标为6的桶中增加1,如下图:

    再读入下一个原始数据为8,则在下标为8的桶中增加1,如下图: 

    以此类推,最后遍历完所有原始数据时,10个桶的计数如下图:

    三、输出数据

    在完成原始数据的遍历计数后,接下来遍历各个桶,输出数据:

    元素0计数为1,则输出0,

    元素1计数为2,则输出1 1,

    元素2计数为1,则输出2,

    元素3计数为1,则输出3,

    元素4计数为1,则输出4,

    元素5计数为1,则输出5,

    元素6计数为1,则输出6,

    元素7计数为0,则不输出元素,

    元素8计数为1,则输出8,

    元素9计数为1,则输出9,

    最后结果输出为:0, 1, 1, 2, 3, 4, 5, 6, 8, 9


    代码实现

    由上述原理可以看出,桶排序需要以下三个步骤:

    1.申请一个包含所有元素的数组,并初始化。

    2.遍历原始数据,并计数。

    3.遍历计数完成后的各个数组元素,输出数据。

    以下是python代码的实现:

    复制代码
     1 #!/usr/bin/env python
     2 #-*- coding:utf8 -*-
     3 
     4 class BucketSort(object):
     5     '''
     6     self.datas:       要排序的数据列表
     7     self.bucketSize:  水桶的大小(数据集的范围,如bucketSize=10,
     8                       则表示数据集的范围为0-9)
     9     self.result:      保存排序后的结果
    10     self.bucket:      代表水桶,指数据集内的所有元素
    11     _sort():          排序函数
    12     show():           输出结果的函数
    13 
    14     用法:
    15     BucketSort(datas, size)   或者BucketSort(datas),size的默认值为100
    16 
    17     BucketSort(datas)._sort() 这样就是开始排序
    18     BucketSort(datas).show()  这样就可以把排序后的结果输出
    19     '''
    20     def __init__(self, datas, size=100):
    21         self.datas = datas
    22         self.bucketSize = size
    23         self.result = [0 for i in range(len(datas))]
    24         self.bucket = [0 for i in range(self.bucketSize)]
    25 
    26     def _sort(self):
    27         # 读入各个元素,并在对应的位置统计,当bucket里的元素不为0
    28         # 就保存到result里面
    29         for num in self.datas:
    30             self.bucket[num] += 1
    31         j = 0
    32         for i in range(self.bucketSize):
    33             while(self.bucket[i]):
    34                 self.result[j] = i
    35                 self.bucket[i] -= 1
    36                 j += 1
    37 
    38     def show(self):
    39         print "Resutl is:",
    40         for i in self.result:
    41             print i,
    42         print ''
    43 
    44 
    45 if __name__ == '__main__':
    46     try:
    47         size = raw_input("Please input size(default=100):")
    48         if size:
    49             size = int(size)
    50         datas = raw_input('Please input some number:')
    51         datas = datas.split()
    52         datas = [int(datas[i]) for i in range(len(datas))]
    53     except Exception:
    54         pass
    55     if size:
    56         bks = BucketSort(datas, size)
    57     else:
    58         bks = BucketSort(datas)
    59     bks._sort()
    60     bks.show()
    =================================

    以下代码更容易理解:
    # 实现快排
    def quicksort(nums):
        if len(nums) <= 1:
            return nums
     
        # 左边数组
        left = []
        # 右边数组
        right = []
        # 基准数
        base = nums.pop()
     
        # 对原数组进行划分
        for x in nums:
            if x < base:
                left.append(x)
            else:
                right.append(x)
     
        # 递归调用
        return quicksort(left) + [base] + quicksort(right)
     
    if __name__ == '__main__':
        nums = [6,1,2,7,9,3,4,5,10,8]
        print quicksort(nums)
    ---------------------  
    作者:正牌小白牙  
    来源:CSDN  
    原文:https://blog.csdn.net/weixin_41678663/article/details/81813759  
    版权声明:本文为博主原创文章,转载请附上博文链接!
    复制代码

    总结:

    1.桶排序的优点就是特别快,真的是特别快!特别快!特别块!

    2.缺点就是特别耗资源,如果数据取值的范围是0---1010, 就要申请一个大小为1010的数组,想想这得多耗内存空间。阔怕!

    3.我上面写的程序也只是一个演示性的,漏洞挺多,目前只能排序大于零的整数。

  • 相关阅读:
    A1023 Have Fun with Numbers (20分)(大整数四则运算)
    A1096 Consecutive Factors (20分)(质数分解)
    A1078 Hashing (25分)(哈希表、平方探测法)
    A1015 Reversible Primes (20分)(素数判断,进制转换)
    A1081 Rational Sum (20分)
    A1088 Rational Arithmetic (20分)
    A1049 Counting Ones (30分)
    A1008 Elevator (20分)
    A1059 Prime Factors (25分)
    A1155 Heap Paths (30分)
  • 原文地址:https://www.cnblogs.com/fengff/p/10361233.html
Copyright © 2011-2022 走看看