排序类型:
下面写一写我对这些排序的理解:
代码部分为C语言书写
1、冒泡排序:
最最最基础的排序,确定一个元素a[i]后,与相邻的元素a[i+1]进行比较,要是a[i]大,就a[i]继续和后面的比,要是a[i+1]大,就a[i+1]和后面的元素比。就像排位赛一样,小王和小李PK,小王赢了,小王继续战斗,与后面的选手PK,一轮PK完后,谁厉害,就是第一名。然后第二轮PK,还是从未排序的第一个人开始,一轮一轮,每次角逐一个最厉害。
void BubbleSort(RecordType r[], int n)
{//对记录数组r做冒泡排序,n为数组长度
change = TRUE;
for(i=1;i<n-1 && change;++i)
{
change = FALSE;
for(j=1;j<=n-1;++j)
{
if(i[j].key>r[j+1].key)
{
x=r[j];
r[j]=r[j+1];
r[j+1]=x;
change=TRUE;
}
}
}
}
2、快速排序
快速排序,最大的特点就是快速
类比两个施工队,施工队一:L,施工队二:R,挖出一块土:T
L先施工,T被挖出来,T原来的位置就有个坑,然后R施工,但是在R施工前,估计自己挖的土和T哪个多,要是自己挖的多,就不挖这个地方,去前面的地方,再估计和T作比较,这次挖要比T少,就开工,把挖的土给L,干完之后,开始休息,L开始施工,L估计然后和T作比较,这次挖的比T多,就开工,把挖的土给R,干完之后休息,R在动工。慢慢R和L汇合到了一起,还有唯一的一个坑,将T填入。然后L和R动工的部分不一定是有序的,所以这两个部分还要自己排序。
void QKSort(RecordType r[],int low,int 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)
{
x=r[low];//选择基准记录
while(low<high)
{
while(low<high && r[high].key>=x.key)
high--;//high从右往左找到小于x.key的记录
if(low<high)
{
r[low]=r[high];
low++;
}//找到小于x.key的记录,则送入“空单元”r[low]中
while(low<high && r[low].key<x.key)
low++;
if(low&l