设为首页 加入收藏

TOP

算法基础(二)
2017-10-09 17:30:23 】 浏览:4954
Tags:算法 基础
hout the first element) and swap it with the second element. Then you look for the smallest element in the remaining array (an array without first and second elements) and swap it with the third element, and so on. Here is an example

基本思想:

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

简单选择排序的示例:

算法实现:

 1 def select_sort(array):  2     for i in range(len(array)-1):  # 找出最小的数放与array[i]交换
 3         for j in range(i+1, len(array)):  4             if array[i] > array[j]:  5                 temp = array[i]  6                 array[i] = array[j]  7                 array[j] = temp  8 
 9 
10 if __name__ == "__main__": 11     array = [265, 494, 302, 160, 370, 219, 247, 287, 12              354, 405, 469, 82, 345, 319, 83, 258, 497, 423, 291, 304] 13     print(array) 14  select_sort(array) 15     print(array)

选择排序复杂度: 

时间复杂度: 最好情况O(n^2), 最坏情况O(n^2), 平均情况O(n^2)

空间复杂度: O(1)

稳定性: 不稳定

举个例子:序列5 8 5 2 9, 我们知道第一趟选择第1个元素5会与2进行交换,那么原序列中两个5的相对先后顺序也就被破坏了。

排序效果:

 

 

三、直接插入排序

插入排序(Insertion Sort)的基本思想是:将列表分为2部分,左边为排序好的部分,右边为未排序的部分,循环整个列表,每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

插入排序非常类似于整扑克牌。

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

也许你没有意识到,但其实你的思考过程是这样的:现在抓到一张7,把它和手里的牌从右到左依次比较,7比10小,应该再往左插,7比5大,好,就插这里。为什么比较了10和5就可以确定7的位置?为什么不用再比较左边的4和2呢?因为这里有一个重要的前提:手里的牌已经是排好序的。现在我插了7之后,手里的牌仍然是排好序的,下次再抓到的牌还可以用这个方法插入。编程对一个数组进行插入排序也是同样道理,但和插入扑克牌有一点不同,不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依次往后移动一个单元。

设监视哨是我大一在书上有看过,大家忽视上图的监视哨。

算法实现:

 1 import time  2 
 3 
 4 def insertion_sort(array):  5     for i in range(1, len(array)):  # 对第i个元素进行插入,i前面是已经排序好的元素
 6         position = i  # 要插入数的下标
 7         current_val = array[position]  # 把当前值存下来
 8         # 如果前一个数大于要插入数,则将前一个数往后移,比如5,8,12,7;要将7插入,先把7保存下来,比较12与7,将12往后移
 9         while position > 0 and current_val < array[position-1]: 10             array[position] = array[position-1] 11             position -= 1
12         else:  # 当position为0或前一个数比待插入还小时
13             array[position] = current_val 14 
15 
16 
17 
18 if __name__ == "__main__": 19     array = [92, 77, 67, 8, 6, 84, 55, 85, 43, 67] 20     print(array) 21     time_start = time.time() 22  insertion_sort(array) 23     time_end = time.time() 24     print("time: %s" % (time_end-time_start)) 25     print(array)

输出:

[92, 77, 67, 8, 6, 84, 55, 85, 43, 67]
time: 0.0
[6, 8, 43, 55, 67, 67, 77, 84, 85, 92]

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

直接插入排序复杂度: 

时间复杂度: 最好情况O(n), 最坏情况O(n^2), 平均情况O(n^2)

空间复杂度: O(1)

稳定性: 稳定

个人感觉直接插入排序算法难度是选择/冒泡算法是两倍……

 

 

四、快速排序

快速排序示例:

算法实现:

 1 def quick_sort(array, left, right):  2     '''
 3  :param array:  4  :param left: 列表的第一个索引  5  :param right: 列表最后一个元素的索引  6  :return:  7     '''
 8     if left >= right:  9         return
10 
11     low = left 12     high = right 13     key = array[low]  # 第一个值,即基准元素
14 
15     while low < high:  # 只要左右未遇见
16         while low < high and array[high] > key:  # 找到列表右边比key大的值 为止
17             high -= 1
18         # 此时直接 把key跟 比它大的array[high]进行交换
19         array[low] = array[high] 20         array[high] = key 21 
22         while low < high and array[low] <= key:  # 找到key左边比key大的值,这里为何是<=而不是<呢?你要思考。。。
23             low += 1
24         # 找到了左边比k大的值 ,把array[high](此时应该刚存成了key) 跟这个比key大的array[low]进行调换
25         array[high] = array[low] 26         array[low] = key 27 
28     quick_sort(array, left, low-1)  # 最后用同样的方式对分出来的左边的小组进行同上的做法
29     quick_sort(array,low+1, right)  # 用同样的方式对分出来的右边的小组进行同上的做法
30 
31 
32 if __name
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python爬虫实战(三)--------搜.. 下一篇python抽象类+抽象方法实现接口(i..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目