zoukankan      html  css  js  c++  java
  • 排序算法(一)

    一、冒泡排序

    基本思想:

    在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

    冒泡排序(Bubble sort):时间复杂度O(n^2)
    交换排序的一种。其核心思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。

    其实现细节可以不同,比如下面3种:

      1. 最简单排序实现:bubble_sort_simple
      2. 冒泡排序:bubble_sort
      3. 改进的冒泡排序:bubble_sort_advance
    #!/usr/bin/python
    #encoding:UTF-8
    #选择排序:时间复杂度-O(n^2)
    
    import numpy as np
    
    sort_data = [3,1,5,7,2,4,9,6,8,1,5]
    sort_array = np.array(sort_data)
    length = len(sort_array)
    print("冒泡排序开始:")
    for i in range(length):
        for j in range(length - i-1):
            if(sort_array[j] > sort_array[j+1]):
                t = sort_array[j];
                sort_array[j] = sort_array[j+1];
                sort_array[j+1] = t;
    print(sort_array)
    print("排序结束!!!")  
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # 冒泡排序算法
     4 class SQList:
     5     def __init__(self, lis=None):
     6         self.r = lis 
     7     def swap(self, i, j):
     8         """定义一个交换元素的方法,方便后面调用。"""
     9         temp = self.r[i];
    10         self.r[i] = self.r[j];
    11         self.r[j] = temp;
    12     def bubble_sort_simple(self):
    13         """最简单的交换排序,时间复杂度O(n^2)"""
    14         lis = self.r
    15         length = len(self.r)
    16         for i in range(length):
    17             for j in range(i+1, length):#从前往后走,每次找出最小的
    18                 if(lis[i] > lis[j]):
    19                         self.swap(i, j)    
    20     def bubble_sort(self):
    21         """冒泡排序,时间复杂度O(n^2)"""    
    22         lis = self.r 
    23         length = len(self.r)
    24         for i in range(length):
    25             #从后往前走
    26             j = length - 1;
    27             while j >= i:
    28                 if(lis[j-1] > lis[j]):
    29                     self.swap(j, j-1);
    30                 j -= 1;
    31     def bubble_sort_advance(self):
    32         """
    33         冒泡排序改进算法,时间复杂度O(n^2)
    34         设置flag,当一轮比较中未发生交换动作,则说明后面的元素其实已经有序排列了。
    35         对于比较规整的元素集合,可提高一定的排序效率。
    36         """
    37         lis = self.r;
    38         length = len(self.r);
    39         flag = True;
    40         i = 0;
    41         while i < length and flag:
    42             flag = False
    43             j = length - 2
    44             while j >= i:
    45                 if lis[j] > lis[j + 1]:
    46                     self.swap(j, j + 1)
    47                     flag = True
    48                 j -= 1
    49             i += 1        
    50 
    51 if __name__ == '__main__':
    52     sqlist = SQList([3,1,5,7,2,4,9,6,8,1,5]) #sqlist是一个对象
    53     print "冒泡排序:"
    54     print "排序前:", sqlist.r
    55     #sqlist.bubble_sort_simple()
    56     #sqlist.bubble_sort()
    57     sqlist.bubble_sort_advance()
    58     print "排序后:", sqlist.r 
    View Code
    1 排序前: [3, 1, 5, 7, 2, 4, 9, 6, 8, 1, 5]
    2 排序过程:
    3 [1, 3, 1, 5, 7, 2, 4, 9, 6, 8, 5]
    4 [1, 1, 3, 2, 5, 7, 4, 5, 9, 6, 8]
    5 [1, 1, 2, 3, 4, 5, 7, 5, 6, 9, 8]
    6 [1, 1, 2, 3, 4, 5, 5, 7, 6, 8, 9]
    7 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
    8 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
    9 排序后: [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

     二、简单选择排序

    简单选择排序(simple selection sort):时间复杂度O(n^2)
    通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录进行交换。

    通俗的说就是,对尚未完成排序的所有元素,从头到尾比一遍,记录下最小的那个元素的下标,也就是该元素的位置。再把该元素交换到当前遍历的最前面。其效率之处在于,每一轮中比较了很多次,但只交换一次。因此虽然它的时间复杂度也是O(n^2),但比冒泡算法还是要好一点。

    基本思想:

    在要排序的一组数中,选出最小(或者最大)的个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后个数)比较为止。

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # 简单选择排序:时间复杂度-O(n^2)
     4 
     5 class SQList:
     6     def __init__(self, lis=None):
     7         self.r = lis
     8     def swap(self, i, j):
     9         """定义一个交换元素的方法,方便后面调用。"""
    10         temp = self.r[i];
    11         self.r[i] = self.r[j];
    12         self.r[j] = temp;
    13     def select_sort(self):
    14         """简单选择排序,时间复杂度O(n^2)"""
    15         lis = self.r;
    16         length = len(lis);
    17         for i in range(length):
    18             minimum = i;
    19             for j in range(i+1, length):
    20                 if(lis[minimum] > lis[j]):
    21                     minimum = j;
    22             if i != minimum:
    23                 self.swap(minimum, i);
    24     def __str__(self):
    25         ret = ""
    26         for i in self.r:
    27             ret += " %s" % i
    28         return ret
    29 if __name__=='__main__':
    30     sqlist = SQList([3,1,5,7,2,4,9,6,8,1,5]);
    31     sqlist.select_sort();
    32     print sqlist.r
    33 '''
    34 import numpy as np
    35 to_insert_data = [3,1,5,7,2,4,9,6,8,1,5]
    36 to_insert_array = np.array(to_insert_data)
    37 length = len(to_insert_array)
    38 print("选择排序法:")
    39 for i in range(length):
    40     minimum = i
    41     for j in range(i+1, length):
    42         if(to_insert_array[minimum] > to_insert_array[j]):#第i个元素之和最小的元素交换
    43             minimum = j;
    44     if(minimum != i):
    45         t = to_insert_array[minimum];
    46         to_insert_array[minimum] = to_insert_array[i];
    47         to_insert_array[i] = t;
    48 print(to_insert_array)
    49 print("一切正常!!!")
    50 '''
    View Code
     1 排序过程:
     2 [1, 3, 5, 7, 2, 4, 9, 6, 8, 1, 5]
     3 [1, 1, 5, 7, 2, 4, 9, 6, 8, 3, 5]
     4 [1, 1, 2, 7, 5, 4, 9, 6, 8, 3, 5]
     5 [1, 1, 2, 3, 5, 4, 9, 6, 8, 7, 5]
     6 [1, 1, 2, 3, 4, 5, 9, 6, 8, 7, 5]
     7 [1, 1, 2, 3, 4, 5, 9, 6, 8, 7, 5]
     8 [1, 1, 2, 3, 4, 5, 5, 6, 8, 7, 9]
     9 [1, 1, 2, 3, 4, 5, 5, 6, 8, 7, 9]
    10 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
    11 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
    12 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
    13 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

    三、直接插入排序

    直接插入排序(Straight Insertion Sort):时间复杂度O(n^2)
    基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 #插入排序算法:时间复杂度-O(n^2)
     4 class SQList:
     5     def __init__(self, lis=None):
     6         self.r = lis;
     7     def insert_sort(self):
     8         lis = self.r;
     9         length = len(lis);
    10         for i in range(1, length):
    11             if(lis[i-1] > lis[i]):
    12                 temp = lis[i];#哨兵
    13                 j = i-1;
    14                 while(j>=0 and lis[j] > temp):
    15                     lis[j+1] = lis[j];
    16                     j -= 1;
    17                 lis[j+1] = temp;
    18             print lis;
    19     def __str__(self):
    20         ret = ""
    21         for i in self.r:
    22             ret += " %s" % i
    23         return ret        
    24 if __name__ == '__main__':
    25     sqlist = SQList([3,1,5,7,2,4,9,6,8,1,5])
    26     print "排序前", sqlist.r
    27     print "-----------------"
    28     print "排序过程如下:"
    29     sqlist.insert_sort();
    30     print "-----------------"
    31     print "排序结果",sqlist.r
    32     print "OK"
    View Code

    执行过程:

     1 排序前 [3, 1, 5, 7, 2, 4, 9, 6, 8, 1, 5]
     2 -----------------
     3 排序过程如下:
     4 [1, 3, 5, 7, 2, 4, 9, 6, 8, 1, 5]
     5 [1, 3, 5, 7, 2, 4, 9, 6, 8, 1, 5]
     6 [1, 3, 5, 7, 2, 4, 9, 6, 8, 1, 5]
     7 [1, 2, 3, 5, 7, 4, 9, 6, 8, 1, 5]
     8 [1, 2, 3, 4, 5, 7, 9, 6, 8, 1, 5]
     9 [1, 2, 3, 4, 5, 7, 9, 6, 8, 1, 5]
    10 [1, 2, 3, 4, 5, 6, 7, 9, 8, 1, 5]
    11 [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 5]
    12 [1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5]
    13 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
    14 -----------------
    15 排序结果 [1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
    16 OK

     参考文档:

    http://www.cnblogs.com/feixuelove1009/p/6143539.html

  • 相关阅读:
    实验四 决策树
    实验三 朴素贝叶斯算法及应用
    实验二 k邻近算法及应用
    实验一 感知器及其应用
    实验三 面向对象分析与设计
    个人作业三---ATM管理系统
    流程图与活动图的区别于联系
    个人作业---四则运算生成程序
    面向对象分析与设计
    结构化分析与设计
  • 原文地址:https://www.cnblogs.com/yuzhuwei/p/6477206.html
Copyright © 2011-2022 走看看