复习了一下排序算法,又因为在学习python,所以用python把复习到的排序实现了一下。
一、直接插入排序
直接插入排序,平均时间复杂度为O(n^2),它是在遍历的时候,将已经遍历的数据都排好序,然后将新遍历到的数据插入到适合的位置。`
A = [6,5,3,1,8,7,2,4]
for i in range(1,len(A)):
j = i-1
temp = A[i]
while (j >= 0 and A[j] > temp):
A[j+1] = A[j]
j = j - 1
A[j+1] = temp
print A
二、二分插入排序
二分插入排序是对插入排序的一种改进,在将遍历到的新数据插入已经排好序的数据列表中用二分法使得遍历次数减少,在数据量大的情况下优化比较明显。`
A = [5,2,9,4,7,6,1,3,8]
for i in range(1,len(A)):
res = A[i]
left = 0
right = i - 1
while(left <= right):
mid = (left + right) / 2
if(A[mid] > res):
right = mid - 1
else:
left = mid + 1
for j in range(i-1,left-1,-1):
A[j + 1] = A[j]
A[left] = res
for i in range(len(A)):
print A[i],`
三、选择排序
选择排序是每次遍历的时候都找到数据中的最小值,然后放到已经排好序的数据中的末尾,其实就是每次从未排序的第一个数start_num开始遍历,将找到的最小值与start_num交换。`
A = [8,5,2,6,9,3,1,4,0,7]
for i in range(len(A)):
min = A[i]
flag = i
for j in range(i,len(A)):
if(min > A[j]):
min = A[j]
flag = j
A[i],A[flag] = A[flag],A[i]
print A
`
四、希尔排序
希尔排序是自己设置一个增量,我习惯取中值作为增量,通过增量将数据分为n组数据,对这n组数据进行插入排序,之后继续取中值直到增量为1为止。希尔排序在最好情况下时间复杂度可以达到O(nlgn)。`
def ShellSort(list):
gap = len(list)
gap = gap / 2
while(gap >= 1):
for i in range(gap,len(list)):
j = i - gap
temp = list[i]
while(j >= 0 and temp < list[j]):
list[j + gap] = list[j]
j = j - gap
list[j + gap] = temp
gap = gap / 2
A = [5,2,9,4,7,6,1,3,8]
ShellSort(A)
print A
`
五、快速排序
快速排序,平均时间复杂度为O(NlgN),最坏情况下能达到O(n^2),但是这种情况不常见,快速排序用分治策略把一个序列分为两个子序列。划分序列的时候先把序列中的一个值作为基准,然后把比基准小的都放到左边,比基准大的都放到右边,然后递归的进行划分操作,结束条件是序列的大小是0或者1,这个时候就已经排好序了。`
def partition(list,start_index,end_index):
flag = list[start_index]
j = start_index-1
temp = start_index
for i in range(start_index+1,end_index+1):
if list[i] < flag:
j += 1
temp = i
list[j],list[i] = list[i],list[j]
list[j+1],list[temp] = list[temp],list[j+1]
return j+1
def quicksort(list,start_index,end_index):
if(start_index < end_index):
flag = partition(list, start_index, end_index)
quicksort(list, start_index, flag - 1)
quicksort(list, flag + 1, end_index)
A = [5,2,9,4,7,6,1,3,8]
quicksort(A, 0, len(A)-1)
print(A)
`