冒泡排序和快速排序

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;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值