题目:给定一组整数,请把这些数由小到大输出。
1、冒泡排序
冒泡排序是最简单的排序之一,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。冒泡排序的时间复杂度为O(n^2)。
arr=[1,0,23,26,12,49,3,87,56,100,8,-98]
n=len(arr)
for i in range(0,n):
for j in range(i+1,n):
if arr[i]>arr[j]:
arr[i],arr[j]=arr[j],arr[i]
print arr
2、选择排序
选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面。但是过程不同,冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择。举个栗子,对5,3,8,6,4这个无序序列进行简单选择排序,首先要选择5以外的最小数来和5交换,也就是选择3和5交换,一次排序后就变成了3,5,8,6,4.对剩下的序列一次进行选择和交换,最终就会得到一个有序序列。其实选择排序可以看成冒泡排序的优化,因为其目的相同,只是选择排序只有在确定了最小数的前提下才进行交换,大大减少了交换的次数。选择排序的时间复杂度为O(n^2)
arr=[1,0,23,26,12,49,3,87,56,100,8,-98]
n=len(arr)
for i in range(0,n):
min = i#最小值的索引
for j in range(i+1,n):
if arr[j]<arr[min]:#发现更小的数,则更改最小值的索引
min=j
if(min!=i):
arr[i], arr[min]=arr[min], arr[i] #//如果min不为i,说明找到了更小的值,交换
print arr
3、插入排序
插入排序不是通过交换位置而是通过比较找到合适的位置插入元素来达到排序的目的的。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将第一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。举个例子,对5,3,8,6,4这个无序序列进行简单插入排序,首先假设第一个数的位置时正确的,第一个数没必要排序。然后3要插到5前面,把5后移一位,变成3,5,8,6,4.想一下整理牌的时候应该也是这样吧。然后8不用动,6插在8前面,8后移一位,4插在5前面,从5开始都向后移一位。注意在插入一个数的时候要保证这个数前面的数已经有序。简单插入排序的时间复杂度也是O(n^2)。
#coding=utf-8
arr=[1,0,23,26,12,49,3,87,56,100,8,-98]
n=len(arr)
for i in range(1,n):
t=arr[i]#待插入的值
j=i
while j>0 and t<arr[j-1]:
arr[j]=arr[j-1] #向后移动
arr[j-1] = t #插入目标值
j -= 1
print arr
4、快速排序
快速排序在实际应用当中快速排序确实也是表现最好的排序算法。快速排序思想来自冒泡排序,冒泡排序是通过相邻元素的比较和交换把最小的冒泡到最顶端,而快速排序是比较和交换小数和大数,这样一来不仅把小数冒泡到上面同时也把大数沉到下面。
举个例子:对5,3,8,6,4这个无序序列进行快速排序,思路是右指针找比基准数小的,左指针找比基准数大的,交换之。
5,3,8,6,4 用5作为比较的基准,最终会把5小的移动到5的左边,比5大的移动到5的右边。
5,3,8,6,4 首先设置i,j两个指针分别指向两端,j指针先扫描(思考一下为什么?)4比5小停止。然后i扫描,8比5大停止。交换i,j位置。
5,3,4,6,8 然后j指针再扫描,这时j扫描4时两指针相遇。停止。然后交换4和基准数。
4,3,5,6,8 一次划分后达到了左边比5小,右边比5大的目的。之后对左右子序列递归排序,最终得到有序序列。
上面留下来了一个问题为什么一定要j指针先动呢?首先这也不是绝对的,这取决于基准数的位置,因为在最后两个指针相遇的时候,要交换基准数到相遇的位置。一般选取第一个数作为基准数,那么就是在左边,所以最后相遇的数要和基准数交换,那么相遇的数一定要比基准数小。所以j指针先移动才能先找到比基准数小的数。
快速排序是不稳定的,其时间平均时间复杂度是O(nlgn)。
#encoding=utf-8
# 快速排序
def quick_sort(arr, left, right):
if left >= right:
return arr
key = arr[left]
low = left
high = right
while left < right:
while left < right and arr[right] >= key:
right -= 1
arr[left] = arr[right]
while left < right and arr[left] <= key:
left += 1
arr[right] = arr[left]
arr[right] = key
quick_sort(arr, low, left - 1)
quick_sort(arr, left + 1, high)
return arr
arr=[1,0,23,26,12,49,3,87,56,100,8,-98]
quick_sort(arr,0,2)
print arr