活动地址:CSDN21天学习挑战赛
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减排列起来的操作。排序是计算机内经常进行的一种操作,其目的是将一组无序的记录序列调整为有序的记录序列。
排序算法 | 平均时间复杂度度 |
---|---|
冒泡排序 | O ( n 2 ) O(n^2) O(n2) |
选择排序 | O ( n 2 ) O(n^2) O(n2) |
插入排序 | O ( n 2 ) O(n^2) O(n2) |
希尔排序 | O ( n 3 / 2 ) O(n^{3/2}) O(n3/2) |
快速排序 | O ( n ∗ log n ) O(n*\log n) O(n∗logn) |
归并排序 | O ( n ∗ log n ) O(n*\log n) O(n∗logn) |
堆排序 | O ( n ∗ log n ) O(n*\log n) O(n∗logn) |
基数排序 | O ( d ( n + r ) ) O(d(n+r)) O(d(n+r)) |
插入排序适用于少量数据且基本有序的排列。
插入排序将排序数组分为两部分:第一部分为除最后一个元素的所有元素组成的数组,第二部分为最后一个元素(待插入元素)。第一部分完成排序后,将第二部分插入第一部分。
折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中。
有一组数据待排序,排序区间为Array[0]~Array[n-1]
。将数据分为有序数据和无序数据,第一次排序时默认Array[0]
为有序数据,Array[1]~Array[n-1]
为无序数据。有序数据分区的第一个元素位置为low
,最后一个元素的位置为high
。
遍历无序区间的所有元素,每次取无序区间的第一个元素Array[i]
,因为0~i-1
是有序排列的,所以用中点m
将其平分为两部分,然后将待排序数据同中间位置为m的数据进行比较,若待排序数据较大,则low~m-1
分区的数据都比待排序数据小,反之,若待排序数据较小,则m+1~high
分区的数据都比 待排序数据大,此时将low
或high
重新定义为新的合适分区的边界,对新的小分区重复上面操作。直到low
和high
的前后顺序改变,此时high+1
所处位置为待排序数据的合适位置。
参考代码折半插入排序的 python 实现
#--coding: utf8 --
def bin_insertion_sort(arr):
arrlen = len(arr)
for i in range(1, arrlen):
insert(arr, i)
def insert(arr, i):
bin_insert(arr, 0, i - 1, i)
def bin_insert(arr, low, high, i):
# low > high是这个递归的终止条件
middle = (low + high) // 2
if low <= high:
if arr[middle] < arr[i]:
# i应该在的位置在middle后面
bin_insert(arr, middle + 1, high, i)
else:
# i应该在的位置在middle前面
bin_insert(arr, low, middle - 1, i)
else:
tmp = arr[i]
for j in reversed(range(low, i)):
arr[j + 1] = arr[j]
arr[low] = tmp
arr = [3,9,8,4,5,2,10,18,4]
bin_insertion_sort(arr)
print(arr)
[2, 3, 4, 4, 5, 8, 9, 10, 18]
1.一文学懂经典算法系列之:直接插入排序
2.张清云.《Python数据结构学习笔记》(ISBN:9787113269999)
3. 排序----折半插入排序
4.折半插入排序的 python 实现
@夏日回音