1. 冒泡排序和快速排序都是借助“交换”进行排序的方法。
2. 冒泡排序的过程:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.r[1].key>L.r[2].key),则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。以此类推,直至第n-1个记录和第n个记录的关键字进行过对比为止。上述过程称作第一趟冒泡排序,其结果是使得关键字最大的记录被安置在最后一个记录的位置上。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。一般地,第i趟冒泡排序是从第L.r[1]到L.r[n-i+1]依次比较相邻两个记录的关键字,并在逆序时交换相邻记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上。冒泡排序结束的条件是:在一趟排序中没有进行过交换记录的操作。
3. 冒泡排序的效率:容易看出,若初始序列为“正序”序列,则只需进行一趟排序,在排序过程中进行n-1次关键字间的比较,且不移动记录;反之,若初始序列为“逆序”序列,则需进行n-1趟排序,需进行次比较,并做等量级的记录移动。因此,总的复杂度为O(n2)。
4. 快速排序(Quick Sort)是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
int partition2(int low, int high)
{
int pivotkey;
pivotkey = a[low];
while(low<high)
{
//从表的两端向中间进行扫描
while(low<high && a[high]>=pivotkey)//高端记录的关键字大于枢轴关键字
high--;//高端向低移,继续比较
a[low] = a[high]; //将比枢轴关键字小的记录移到低端
while(low<high && a[low]<=pivotkey)//低端记录的关键字小于枢轴关键字
low++;//低端向高移,继续比较
a[high] = a[low];
}
a[low] = pivotkey;
return low;
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int start,int end)
{
int mid;
int i = start-1;
int j;
int x = a[end];
for(j=start;j<=(end-1);j++)
{
if(a[j]<=x)
{
i = i+1;
swap(&a[i],&a[j]);
}
}
swap(&a[i+1],&a[end]);
mid = i+1;
printf("mid=%d\n",mid);
return mid;
}