交换排序
Posted privilege
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交换排序相关的知识,希望对你有一定的参考价值。
交换排序
一、冒泡排序
二、快速排序
冒泡排序:
(一)简单冒泡排序
void BubbleSort0(SqList &L)
for(int i=1;i<L.len;i++)
for(int j=i+1;j<=L.len;j++)
if (L.elem[i].key > L.elem[j].key)
swap(L.elem,i,j);
存在的问题:
不符合“两两比较相邻记录”思想,不是标准冒泡排序。
每轮只将最小记录移到合适位置,但对下轮排序无帮助。
标准冒泡排序:
void BubbleSort0(SqList &L)
for(int i=1;i<L.len;i++)
for(int j=L.len-1;j>=i;j--)
if (L.elem[j].key > L.elem[j+1].key)
swap(L.elem,j,j+1);
标准冒泡优化:
增加flag避免无效排序
void BubbleSort0(SqList &L)
flag =1;
for(int i=1;i<L.len && flag;i++)
flag = 0;
for(int j=L.len-1;j>=i;j--)
if (L.elem[j].key > L.elem[j+1].key)
swap(L.elem,j,j+1);
flag = 1;
性能分析:
时间复杂度 最好情况O(n)
本身有序: n-1 次数据比较、无数据移动。
最坏情况
比较次数: (n-1)+(n-2)+...+1 = 1/2 n² - 1/2n
移动次数:每次交换需要3次数据移动,但与比较次数相同数量级。
时间复杂度 O(n²)
假设最好最坏等情况都是等概率出现,则
比较次数:O(n²)
移动次数:O(n²)
空间复杂度
数据交换时:只需1个周转空间O(1)
算法稳定性
关键字交换:顺序进行 稳定
快速排序
交替震荡逼近法
划分思路
选取枢轴关键字,一般选择第一个数据。
从高位向前搜索第一个关键字小于枢轴的记录,移到低空位。
从低位向后搜索第一个关键字大于枢轴的记录,移到高空位。
算法实现 快速划分算法
int Partition(SqList & L, int low,int high)
L.elem[0] = L.elem[low];
while(low < high)
while(low < high && L.elem[high].key >= L.elem[0].key)
high--;
swap(L.elem,low,high)
while(low < high && L.elem[low].key <= L.elem[0].key)
low++;
swap(L.elem,low,high)
Lelem[low] = L.elem[0];
return low;
递归排序算法
void QuickSort(SqList &L,int low,int high)
if(low<high)
pivot = Partition(L,low,high);
QuickSort(L,low,pivot-1);
QuickSort(L,pivot+1,high);
算法性能分析
时间复杂度
最好情况:定性分析 nlogn
可以看作是完全二叉树logn
应为每一层有n个数据
所以n*logn
最差情况:定性分析
O(n²)
空间复杂度:
最好情况:log2n层调用,O(logn)
最坏情况:n-1层调用,O(n)
平均性能O(logn)
排序稳定性
关键字比较和交换:跳跃进行 不稳定
快速算法优化
枢轴改进:随机位置法、三数取中法
其他改进:小数组时优化 引入插入排序
递归过程优化 尾递归:迭代替代递归
void Qsort(SqList &L,int low,int high)
if((high - low) > MAX_INSERT_SORT_LEN)
while(low<high)
pivot = Partition(L,Low,high);
Qsort(L,Low,pivot-1);
low = pivot +1;
else InsertSort(L,low,high);
总结
基本思想:两两数据比较,逆序则交换,直到无逆序为止。
冒泡排序:交换策略:两两比较相邻记录。
优化策略:若某轮无交换,则全局有序。
时间复杂度:O(n2),空间复杂度:O(1)
稳定性:稳定
快速排序:
交换策略:枢轴关键字分治数据集
优化策略:枢轴选取优化+小数据集优化+尾递归优化。
时间复杂度:O(n* logn),空间复杂度:O(logn)
稳定性:不稳定
以上是关于交换排序的主要内容,如果未能解决你的问题,请参考以下文章