快速排序(适用于C语言初学者,附完整代码)

  • Post author:
  • Post category:其他


快速排序

基本思想

快速排序的基本思想就是寻找一个轴值,此轴值将待排序数列分成两部分,左侧的数据均小于轴值,右侧的数据均大于轴值,在从左右两侧分别找取各自的轴值,很明显用到了递归的思想,此文轴值的寻找方法为去待排数据的第一个元素。

如何将轴值(第一个数据)放到正确的位置上

以正向排序(自小到大)为例,将first指向待排数据的第一个元素,last指向最后一个元素,保持first不动,将last从待排数据的末尾向前推进,直到first指向的值大于last指向的值,然后将first指向的值和last指向的值交换位置,但保持first与last不变,再保持last的值不变,将first的值向后推进,直到first指向的值大于last指向的值,然后将first指向的值和last指向的值交换位置,但保持first与last不变,一直重复下去,直到first大于或等于last。

以下为完整代码

#include<stdio.h>
//将轴值(第一个数据)放到正确的位置上 
int Part(int arr[],int first,int last) {
	int i = first,j = last,temp;
	while(i < j) {
		while(i < j&&arr[j] >= arr[i]) j--;
		if(i < j) {
			temp = arr[j];
			arr[j] = arr[i];
			arr[i] = temp;
			i++;
		}
		while(i < j&&arr[j] >= arr[i]) i++;
		if(i < j) {
			temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
			j--;
		}
	}
	return i;
}
void Quck(int arr[],int first,int last) {
	if(first >= last) return;
	else {
		//轴值将待排数据分成两个部分,依次对每个小部分进行排序 
		int pivot = Part(arr,first,last);
		Quck(arr,first,pivot-1);
		Quck(arr,pivot+1,last);
	}
}
int main() {
	int arr[6] = {10,51,2,8,3,6},i;
	Quck(arr,0,5);
	for(i = 0;i < 6;i++) {
		printf("%d ",arr[i]);
	} 
	return 0;
}



版权声明:本文为qq_62388672原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。