快速排序

132 阅读1分钟

快速排序:

思路:

	1.把数组第一个元素作为主元
        2.找主元位置(主元左边的数都比主元小,主元右边的数都比主元大,左右两边数字的存放顺序不用在意,因为还会递归进去继续找主元,然后分割)
	3.从主元位置分割,左、右两边分别继续快排(找主元位置,分割)
	4.直到最小下标 = 最大下标(代表着分割的此数组只剩下这一个元素,不再递归)

代码(C语言):

#include <stdio.h>
void quickSort(int* a, int low, int high);
int findPos(int* a, int low, int high);

int main(void) {
	int i;
	int array[] = { 9, 6, -1, -124, 0, -99, -5};

	quickSort(array, 0, 6);	//(数组地址,最小下标,最大下标)
	for (i = 0; i < 7; i++) {
		printf("%d  ", array[i]);
	}
	printf("\n");

	return 0;
        }
        
//排序
void quickSort(int* a, int low, int high) {
	int pos;	//主元位置

	if (low < high) {
		pos = findPos(a, low, high);	//返回pos:主元位置
		quickSort(a, low, pos - 1);
		quickSort(a, pos + 1, high);
	}
}

//把主元放到它的位置,并返回它的下标,用于分割
int findPos(int * a, int low, int high) {
	//函数:找主元位置
	int val = a[low];	//把第一个元素作为主元,存放主元的值

	while (low < high) {	//循环退出条件:low和high相等
		//1.先从右往左找比主元小的
		while (low < high && a[high] >= val)
			--high;
		//找到之后,要把此数给到下标为low的地方
		a[low] = a[high];`

		//2.再从左往右找比主元大的
		while (low < high && a[low] <= val)
			++low;
		//找到之后,要把此数给到下标为high的地方
		a[high] = a[low];

		//3.把主元放到它应该在的位置(low或high都行),此时,主元左边的数都比主元小,主元右边的数都比主元大
		a[low] = val;
	}
	//需要返回主元下标
	return low;		//返回low和high都可以,因为结束循环的条件是 low 等于 high
}