数据结构之快速排序

快速排序

说的有点多,要不直接看代码吧,代码比较容易理解
快速排序:定义一个数组arr,下标0不用(有另一个用处)从1开始存储数据。
1是low,n-1是high,把low此时的下标作为基点。首先把基点存储在arr[0],后从high开始找到小于基点arr[0]的。找到后就把找到的数放到arr[low](因为arr[low]已经保存了,所以可以直接覆盖arr[low]=arr[high]),然后再从low开始找到大于基点的,把找到的数放到arr[high]=arr[low]里面。
注意第一步是从high开始找,而不是从low,因为low这个点的数据我们已经保存了,如果从low开始找那么high这个点的数据会被覆盖。那么有没有可能会出现某些情况而导致数据没保存然后就会覆盖了?不会的。其实他就两种情况,要么high从右边一直走到low,要么low走到了high, 但high已经放到了low移动之前的位置了。如果不明白可以继续看1 、 2点。

1、假如从high开始一直走到low都没有发现比基点小的数那说明low就是最小
的,这时候按照规则小的往左移也就是arr[low]=arr[high]就相当于自己
给自己赋值。	然后就退出了循环。循环外面是arr[low]=arr[0]
这也是一样的。
2、high从右边走向low的时候找到了比基点小的数,然后把它的数据移动到了
左边low那里,然后row就从左边开始走向high, 当它走到high
这个点的时候都没有找到比基点大的数,虽然high比基点小但这语句还是要执
行:arr[high]=arr[low]但这时候high等于low了所以没有影响,然后
arr[high]=arr[0]。剩下的情况就是low左边找到了比基点大的数,
但这时候就跟刚开始没找的时候一样了。
这样当low和high碰面的时候左边就是小于基点的右边就是大于基点的。
最后再把arr[0]放到arr[low]里面(这时候low跟high是相等的)

代码如下

#include<stdio.h>
int Partition(int *arr,int len,int low,int high){
	arr[0]=arr[low];//保存基点  后面是直接覆盖,,不用temp交换
	while(low<high){
		while(low<high&&arr[high]>=arr[0])high--;//找到小于基点的
		arr[low]=arr[high];				//把小于基点的数往左移动
		while(low<high&&arr[low]<=arr[0])low++;//找到大于基点的
		arr[high]=arr[low];				//把大于基点的往右移动
	}
	arr[low]=arr[0];//再把基点放回到数组里
	return low;
}

void QSort(int *arr,int len,int low,int high){
	if(low<high){
		int mid=Partition(arr,len,low,high);//low和high碰面的地方就是mid
		QSort(arr,len,low,mid-1);//对mid左边的数据进行排序
		QSort(arr,len,mid+1,high);//对mid右边的数据进行排序
	}
}
void Print(int *arr,int len){//只是一个输出
	int i;
	for(i=1;i<len;i++){
		printf("%d\t",arr[i]);
	}
}
int main(){
	int arr[10]={0,9,8,7,6,5,4,3,2,1};
	QSort(arr,10,1,9);
	Print(arr,10);
	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值