快速排序

点击查看代码
#include<iostream>
using namespace std;

void Swap(int a[], int i, int j) { //互换a[i]和a[j]
	int tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}

int Partition(int a[], int left, int right) { //分割序列进行排序,将小于分界点的值放到分界点左边,大于分界点的值放到右边
	/*
	//1、固定切分:直接取左边界为分界点
	int tmp = a[left];//暂存分界点的值用作比较基准,防止后面排序时被覆盖
	*/

	//2、三数取中切分:选择中间值为分界点位置。元素比较后的结果:a[right]最大,a[left]中间,a[mid]最小
	//以中间值a[left]为分界点将数组分为两部分,分界点左边的值较小,分界点右边的值较大
	int mid = left + ((right - left) >> 1);
	if (a[mid] > a[right]) Swap(a, mid, right); //互换a[mid]和a[right]
	if (a[left] > a[right]) Swap(a, left, right);
	if (a[mid] > a[left]) Swap(a, mid, left);
	int tmp = a[left];//暂存分界点的值用作比较基准,防止后面排序时被覆盖

	while (left < right) {
		while (left < right && a[right] >= tmp) { //从右往左扫描,直到遇到小于分界点的值
			right--;
		}
		if (left < right) { //right没有超出左界限
			a[left++] = a[right];//将小于分界点的值放在左边left区域,然后left右移1位,开始从左往右扫描
		}
		while (left < right && a[left] <= tmp) {//从左往右扫描,直到遇到大于分界点的值
			left++;
		}
		if (left < right) { //left没有超出右界限
			a[right--] = a[left];//将大于分界点的值放在右边right区域,然后right左移1位,开始从右往左扫描
		}
	}
	a[left] = tmp; //每轮结束后left=right,然后将待插入元素放到a[left]中
	return left;//返回left用作下次递归的新分界点
}

/*
函数功能:快速排序(升序排序)
函数列表:
a[]:待排序序列
left:待排序序列左边界
left:待排序序列右边界
*/
void QuickSort(int a[], int left, int right) { 
	//当序列个数递归分解至1个时退出递归
	if (left < right) {	
		int pivot = Partition(a, left, right);//在[left,right]区间内选择分界点,分割序列进行排序
		QuickSort(a, left, pivot - 1);//对分界点的左半部分进行快速排序
		QuickSort(a, pivot + 1, right);//对分界点的右半部分进行快速排序
	}
}

int main(){
	int a[] = { 80,30,60,40,20,10,50,70 };
	int n = (sizeof(a)) / (sizeof(a[0]));
	cout << "序列个数:" << n << endl;
	cout << "排序前:";
	for (int i = 0; i < n; i++) {
		cout << a[i] << " ";
	}
	cout << endl;
	QuickSort(a, 0, n -1); //快速排序
	cout << "排序后:";
	for (int i = 0; i < n; i++) {
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

posted @ 2022-09-25 15:02  zhaoo_o  阅读(2)  评论(0编辑  收藏  举报