数据结构 - 快速排序

43 篇文章 0 订阅
24 篇文章 0 订阅
#include <stdio.h>
//分区,通过第一个数将数组分为两个部分,返回两个部分的分界点pos
int partition(int a[], int low, int high)
{
	int pos, pivotkey = a[low];//pivoktey保存第一个元素作为关键字

	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;//将关键字置于分界点
	pos = low;
	return pos;
}

void quick_sort(int a[], int low, int high)
{
	int pos;
	if (low < high)
	{
		pos = partition(a, low, high);
		quick_sort(a, low, pos - 1);
		quick_sort(a, pos + 1, high);
	}
}

int main()  
{  
    int i,a[10]={5,0,6,3,2,8,4,9,7,1};  
    printf("排序前:\n");  
    for (i=0;i<10;i++)  
    {  
        printf("%d ",a[i]);  
    }  
    printf("\n");  
    quick_sort(a,0,9);  
    printf("排序后:\n");  
    for (i=0;i<10;i++)  
    {  
        printf("%d ",a[i]);  
    }  
    printf("\n");  
    return 0;  
} 

在函数Partition中,high和low分别记录高低位指针,当出现比较、赋值时,下一次并不是从其对应的下一位置开始,而是从上一次发生赋值的地方开始

什么意思?比如:

while (low < high && a[high] > pivotkey)
		high--;
a[low] = a[high];

:high指向数据比关键字小,将a[high]赋值给a[low],此时并未交换,故a[high]还是原来的值,只有等到low指向的数据赋值给它时,数值才会变。

所以,当再一次轮到high递减的时候,不是从high的前一个位置(high-1)开始比较,而是就从high开始。这样是否多了一次比较了?

是的,但一次比较也无所谓。如果非要严格思想,从high-1开始比,该怎么写代码?如下,可以在每次赋值的时候相应的将待赋值的指针递增或递减(记为指针移动操作),

但是此时,必须要多加一个条件,就是要考虑low < high ,因为前一次的“指针移动操作“可能会导致 low >= high .不是吗?是否有更简单的写法了?


注意一个问题:当交换数据时,是从交换位置开始继续搜索还是其下一个位置开始,这里考虑边界需要慎重,参考代码如下:

	while (low < high)
	{
		while (low < high && a[high] > pivotkey)
			high--;
		if (low < high)	//这里需要添加判断,否则会出现错误,
			a[low++] = a[high];

		while (low < high && a[low] < pivotkey)
			low++;
		if (low <high)	//同理
			a[high--] = a[low];
	}
	a[low] = pivotkey;
	pos = low;
	return pos;
如果上述代码不添加if判断,结果出错,如图







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值