C编程——快速排序

1、程序文件

#include <stdio.h>

// 快速排序(Quicksort)是对冒泡排序的一种改进
// 通过一趟排序将要排序的数据分割成独立的两部分,
// 其中一部分的所有数据都比另外一部分的所有数据都要小,
// 然后再按此方法对这两部分数据分别进行快速排序,
// 整个排序过程可以递归进行,以此达到整个数据变成有序序列。
void mySwap(int *a, int i, int j)
{
	int tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}
void myPrint(int *a, int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		printf ("%4d", a[i]);
	}
	printf ("\n");
}

// 算基准值下标
int partion(int *a, int left, int right)
{
	int pivot = a[right];    // 以最后一个元素作为基准值
	
	while(left < right)
	{
		// 本次循环结束后,a[left]的值比基准值大
		while (a[left] <= pivot && left < right)
		{
			left++;
		}
		if (left < right)
		{
			// 把以left为下标的比基准值更大的元素移到右边

			a[right] = a[left];
			right--;
		}
		
		// 因为之前已经对a[left]进行了判断,所以left < right
		while (a[right] >= pivot && left < right)
		{
			right--;
		}
		
		if (left < right)
		{
			// 把以right为下标的比基准值更小的元素移到左边
			a[left] = a[right];
			left++;
		}
	}
	
	// 因为之前的right处的值已被a[left]覆盖
	// 而right处的值被保存在pivot中
	a[left] = pivot;
	
	// left是基准值下标
	return left;
}

void quickSort(int *a, int left, int right)
{
	if (left < right)
	{
		// 第一次得基准值下标0
		int pivotIndex = partion(a, left, right);    // 算基准值下标
		quickSort(a, left, pivotIndex-1);    // 对左半部分做快速排序
		quickSort(a, pivotIndex+1, right);   // 对右半部分做快速排序
	}
}

int main()
{
	int a[] = {5,8,6,0,9,4,3,2,1,7};
	int len = sizeof(a)/sizeof(a[0]);
	
	quickSort(a, 0, len-1);
	myPrint(a, len);
	
	return 0;
}

2、测试结果

root@lj:/mnt/hgfs/shared-lj# gcc 快速排序study.c 
root@lj:/mnt/hgfs/shared-lj# ./a.out 
0   1   2   3   4   5   6   7   8   9 

猜你喜欢

转载自blog.csdn.net/ypjsdtd/article/details/85197294