基本上,排序算法的输出必须遵守下列两个原则:
输出结果为递增序列(递增是针对所需的排序顺序而言)
输出结果是原输入的一种排列或是重组
十种排序算法一般分为两大类:
十种排序算法复杂度一览:
名词解释:
冒泡排序又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误则交换两个元素,走访数列的工作是重复的进行直到没有需要交换的,也就是说该数列已经排序完成,这个算法名字的由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
方案一:
class BubbleSort01: BaseSort {
override func sortAction() {
if arrayList.count <= 1 { return }
let end = arrayList.count
for j in 0..<end {
for i in 1..<end-j {
if cmpIndex(i, i-1) < 0 {
swap(i, i-1)
}
}
}
}
}
优化方案:
思考:
如果一次内层的for循环 执行一次之后并没有发生交换的操作,
那么就可以证明整个数据是已经有序的了,这个时候就完全可以终止for循环。
这种操作,在数据越接近有序的情况下越明显。
class BubbleSort02: BaseSort {
override func sortAction() {
if arrayList.count <= 1 { return }
let end = arrayList.count
for j in 0..<end {
var exchanged = true
for i in 1..<end-j {
if cmpIndex(i, i-1) < 0 {
swap(i, i-1)
exchanged = false // 没有交换过 说明剩余的数据已经是有序的了
}
}
if exchanged { break }
}
}
}
方案对比结果
var sortArray = createRandom(count: 1000, min: 0, max: 10000)
testSorts(array: sortArray,
BubbleSort01(),
BubbleSort02()
)
结果:
【算法.BubbleSort01】
执行时间:0.6306749582290649 比较次数:499500 交换次数:240953
---------------------------------------------------------------------------------
【算法.BubbleSort02】
执行时间:0.6284579038619995 比较次数:498870 交换次数:240953
---------------------------------------------------------------------------------
可以看到 优化后的方案 比较次数是比较少的,交换次数不变,整体时间上也略有差异。