交换类排序思想:通过一系列交换逆序元素进行排序的方法
1.冒泡排序:通过对相邻的数据元素进行交换,逐步将待排序序列变成有序序列的过程
void BubbleSort(RecordType r[ ],int length) //对记录数组r做冒泡排序,length为数组的长度
{
n=length; change=TRUE;
for(i=1;i<=n-1&&change;++j)
{
change=FALSE;
for(j=1;j<=n-i;++j)
{
if(r[j].key > r[j+1].key)
{
x=r[j];
r[j]=r[j+1];
r[j+1]=x;
change=TRUE;
}
}
}
总移动次数3n(n-1)/2次,时间复杂度O(n2) 空间复杂度O(1)
2.快速排序
算法改进要点:由于冒泡排序扫描过程中只对相邻的两个元素进行比较,因此在互换两个相邻元素时只能消除一个逆序,
如果能通过两个(不相邻的)元素的交换,消除待排序记录中的多个逆序,则会大大加快排序的速度;
void QKSort(RecordType r[ ],int low,int high) //对记录数组r[low,high]用快速排序算法进行排序
{
if(low < high)
{
pos=QKPass(r,low,high); //调用一趟快速排序,以枢轴元素划分为两个子表
QKSort(r,low,pos-1); //对左部子表快速排序
QKSort(r,pos+1,high); //对右部子表快速排序
}
}
一趟快速排序算法
int QKPass(RecordType r[ ],int low,int high) //对记录数组r中的r[low]至r[high]部分进行一趟排序,并得到基准的位置,
使得排序后的结果满足其之后(前)的记录的关键字均不小于(大于)基准记录
{
x=r[low]; //选择基准记录
while(low < high)
{
while(low < high && r[high].key > = x.key)
high--; //high从右到左找小于x.key的记录
if(low < high) { r[row]=r[high]; low++; } 找到小于x.key的记录,则送入"空单元"r[low]
while(low < high && r[low].key <= x.key)
low++; //low从左到右找大于x.key的记录
if(low < high) { r[high]=r[low]; high--;} //找到大于x.key的记录,则送入"空单元"r[high]
}
r[row]=x; //将基准记录保存到low=high位置
return low; //返回基准记录的位置
}
快速排序递归算法的执行过程对应一颗二叉树,理想情况下是一颗完全二叉树,递归工作栈的大小与上述递归调用二叉树的深度对应,平均情况下辅助空间复杂度O(log2 n) 时间复杂度O(nlog2 n) 最好(nlog2 n) 最坏 O(n2)
冒泡排序 空间复杂度O(1) 时间复杂度O( n2) 最好(n) 最坏 O(n2)