交换排序
冒泡排序
最坏情况下 即元素全部逆序 时间复杂度$O(n^2)$
平均时间复杂度也为$O(n^2)$
冒泡排序是一种稳定的排序方法
1 | bool BubbleSort(SqList &L,int n){//n为表长 |
Swap()函数
功能为交换这两个数的位置
快速排序
1 | int Partition(SqList &L,int low,int high){ |
eg:
Circle1:元素初始序列98 36 -9 0 47 23 1 8 10 7
以98为枢轴 从序列末端选择比98小的元素 high指向7 7占据第一个位置
从枢轴后向后遍历选择比枢轴大的元素 low指到了最后一个元素也没有找到 low=high跳出循环 枢轴98占据最后一个位置
Circle2:元素第二次序列变更为7 36 -9 0 47 23 1 8 10| 98
原枢纽98左侧的序列以7位枢轴 从序列末端选择比7小的元素 high指向1 1占据第一个位置
从枢轴后向后遍历选择比枢轴大的元素 low指向36 36换到第二次序列中1的位置 low<high继续循环
high继续向前遍历寻找比枢轴小的元素 high指向0 0换到第二次序列中36的位置
low继续向前遍历寻找比枢轴大的元素 还未遍历到low=high 跳出循环 枢轴7占据第二次序列中0的位置
Circle3:元素第三次序列变更为1 0 -9| 7| 47 23 36 8 10| 98
原枢轴7左侧的序列1 0 -9
以1为枢轴 从序列末端寻找比1小的元素 high指向-9 -9占据第一个位置 从枢轴向后遍历寻找比枢轴大的元素 还未找到 low=high 跳出循环 枢轴1占据第三次序列 -9的位置 左侧序列变更为-9 0 |1
原枢轴7右侧的序列47 23 36 8 10
以47为枢轴 从末端寻找比47小的元素 high指向10 10占据第一个位置 从枢轴向后遍历寻找比枢轴47大的元素 还未找到 low=high 跳出循环 47占据第三次序列中10的位置 右侧序列变更为10 23 36 8 |47
Circle4:元素第四次序列变更为-9 0| 1| 7| 10 23 36 8| 47| 98
左侧序列-9 0
-9为枢轴 从序列末端寻找比枢轴-9小的元素 还未找到low=high 跳出循环 左侧序列依旧为-9| 0
右侧序列10 23 36 8
10为枢轴 从序列末端寻找比10小的元素 high指向8 8占据第一个位置 从枢轴向后遍历寻找比10大的元素 low指向23 23 占据第四次序列中8的位置 high继续向前遍历寻找比枢轴10小的元素 还未找到 low=high 跳出循环 枢轴10占据第四次序列中23的位置
序列变更为8 |10| 36 23
Circle5:元素第五次序列变更为-9| 0| 1| 7| 8| 10| 36 23| 47| 98
其中36 23
以36为枢轴 从序列末端选择比枢轴36小的元素 high指向23 23占据第一个位置 从枢轴向后遍历寻找比36大的元素 还未找到 low=high跳出循环 36占据第五次序列中23的位置
元素最终序列变更为-9 0 1 7 8 10 23 36 47 98
快排结束
时间复杂度:最好情况下(元素序列越无序) 算法效率越高 $O(nlogn)$ 即每一次Partition函数所得的枢轴都平分序列
最坏情况下(元素序列越有序) 算法效率越低 $O(n^2)$ 即每一次Partition函数所得的枢轴都是元素序列的两端点