快速排序

算法思想:

选取一个数据作为基准数,一般选取数组中的第一个数作为基准数。(升序)将比基准数小的数放在基准数的左边,比基准数大的数放基准数右边。把基准数左边和右边的数据再看成两个新的数组,再次使用上述方法选取基准数,调整基准数的位置(递归),直到区间只剩一个数据。

代码:

void quick_sort(int *array,int start,int end){
	int pos = position(array,start,end);
	if(start<end){
		quick_sort(array,start,pos-1);
		quick_sort(array,pos+1,end);
	} 
} 

根据算法思想,先确定基准数的位置,当区间正确时(起始位置小于结束位置)递归分治,解决左边数据和右边数据。这里的position()函数实现了将小于基准数的数据放在基准数左边,比基准数大的数放在基准数的右边,并且返回基准数调整后的位置。下面给出position()函数具体代码。

int position(int *array,int start,int end){
	int mid = *(array+start);
	int i=start;
	int j=end;
	while(i<j){
		while(*(array+j)>=mid&&i<j) j--;
		while(*(array+i)<=mid&&i<j) i++;
		int tmp = *(array+i);
		*(array+i)=*(array+j);
		*(array+j)=tmp;
	}
	*(array+start)=*(array+i);
	*(array+i)=mid;
	return i;
}

首先,先将基准数保存起来(不然一会移动起来就找不到它了,就无法完成比较,交换等操作),别忘了设置两个指针,分别指向起始位置与结束位置(这里的指针只是表示数据的位置,代码中分别为i和j),i用来从左边开始找,找到比基准数大的数(比基准数大的数要放右边嘛),j从右边开始找,找到比基准数小的数(比基准数小的数要放左边),然后交换i和j所指向的数据,这样就把比基准数小的数换到了左边,比基准数大的数换到了右边。然后继续找下一对需要交换的数据(所以需要一个循环结构,将所有需要交换的数据交换)当i=j的时候,就意味着j右边的所有数据都比基准数大,i左边的所有数据都比基准数小(毕竟,刚才不符合的数据都被换走了),同时也意味着i,j就是基准数的位置(所以交换完数据,别忘了把基准数放到它的新位置上)。

一些题外话:

上述代码,采用C语言编写,数组使用指针的形式传入,这么写完全是被考试逼迫,哈哈哈。其实也可以以数组的形式传入,我不太清楚为啥力扣和学校都喜欢用指针传入函数,有知道的大佬麻烦告诉小弟一声,小弟在此谢过了。

我还发现python在实现上述算法时有点赖皮,Python的列表有两个特别的东西,一个是切片,一个是列表推导式。这导致Python实现的时候可以跳过数据交换的步骤,直接获得比基准数大,和比基准数小的列表,整体代码量相较于C语言少了很多,也更简单易读,但这样写显然是使用了更多的空间。(代码如下)

def quick_sort(a):
    if len(a)>1:
        ll = [i for i in a[1:] if i <= a[0]]
        lr = [i for i in a[1:] if i > a[0]]
        x = quick_sort(ll)
        y = quick_sort(lr)
        return x + [a[0]] + y
    else:
        return a

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值