(一)按时间复杂度分类
时间复杂度为o(n*n)的排序方法有:冒泡排序、插入排序、选择排序。
1-冒泡排序
假设数组长度为n。在0-n-1范围内,从0位置的元素开始,比较位置0的元素与位置1的元素的大小,若位置1的元素小于位置0的元素,则交换位置,再比较位置1和位置2元素,依次类推。遍历完0-n-1之后,最大的元素会在位置n-1上。接下来在0-n-2范围内重复上述操作。直到比较范围变成0.
def maopao(nums):
l=len(nums)
for i in range(0,l-1):
for j in range(1,l):
if nums[j] < nums[j-1]:
nums[j-1],nums[j] = nums[j],nums[j-1]
return nums
a=maopao([1,3,2,4,0])
print(a)
2-选择排序
假设数组长度为n。在0-n-1范围内选择最小的元素放在位置0,;然后在1-n-1范围内选择最小的元素放在位置;依次类推,直到范围变成(n-1)-n为止。
def xuanze(nums):
for i in range(0,len(nums)):
min_idx = i
for j in range(i+1,len(nums)):
if nums[j] < nums[min_idx]:
min_idx = j
nums[i],nums[min_idx] = nums[min_idx],nums[i]
return nums
a=xuanze([3,1,2,0,8])
print(a)
3-插入排序
插入排序跟冒泡排序的过程相似。假设数组长度为n,在0-n-1范围内,比较位置0和位置1的元素,若位置1的元素小于位置0,则交换顺序。再比较位置2和位置1的元素,若位置2小于位置1,则交换,交换完之后再用位置1和位置0的元素比较,若位置1小于位置0则交换位置0和位置1的元素。执行完前k个元素,则前k个元素一定是有序的。
def insert(nums):
l=len(nums)
for i in range(1,l):
x=nums[i]
for j in range(i,-1,-1):
if x<nums(j-1):
nums[j] = nums[j-1]
else:
break
nums[j] = x
return nums
squ = insert([1,3,2,4])#example
print([i for i in squ])
时间复杂度为o(n*log(n))的排序方法:归并排序、快速排序、堆排序和写排序。
1-归并排序
首先将数组分成单独的序列,将相邻两个元素变成有序的。再扩大有序范围为4,即将已经有序的相邻的两个元素再排序,及数组的有序单元长度为4,依次类推,知道有序长度等于数组长度。
2-快速排序
在数组中随机选择一个数a,将小于a的数放在a的左边,大于a的数放在a的右边。然后分别在a左边和a的右边递归执行以上操作。
3-希尔排序
希尔排序与插入排序相似,只不过是步长不同。假设设置步长为3,则从位置为3的元素开始,比较位置3和位置1的元素,若位置3小于位置1的元素,则交换位置。然后进行位置4与位置2的匀速比较,若位置4大于位置2,则交换停止。进行位置5与位置3,若位置5小于位置3则交换两元素位置,再比较位置3与位置0,若位置3小于位置0,则交换,否则停止交换。遍历完整个数组之后第一次排序结束。调整步长,重复上述操作。知道步长为1执行完则得到有序数组。
4-堆排序
(还没完全理解,之后补充)堆顶位置元素最大,最大放在最后。
(二) 按稳定性分类
稳定性是相同值的元素再排序前和排序后相对位置保持不变。
稳定的排序算法有:冒泡、插入、归并、计数、基数、桶排序。
不稳定的排序算法有:选择、快速、希尔、堆排序。
补充:数组长度较小时选择插入排序。而当数组长度较大时,选择快速排序或其他复杂度为o(n*log(n))的排序方法。
其他的排序及实现的代码之后补充。^ _ ^