快速排序,c/c++描述

  在插入排序的基础上形成了分组插入排序,即希尔排序。在交换排序,即冒泡排序的基础上,形成了快速排序。冒泡排序,是相邻的元素进行比较和交换,所以交换次数会很多。而快速排序,加大了元素比较和交换的距离,故减少了交换次数。快速排序,是以数组某元素为轴,排序后,把数组分为两部分。大于轴元素的排在其后面,小于等于轴元素的排在其前面。递归进行。直到待排序的子数组长度为1。该算法是递归的。一般以数组首元素为轴。
  改进的快速排序:
  (1)修正轴元素的值,其值确保为关键字中大小居中的值,避免为最大关键字值或最小关键字值,使得递归树接近于完全二叉树。
  (2)轴元素的值另行保存,在每一次划分过程partition中,只调整不等于轴元素值的记录位置,待划分结束,确定了轴元素的最终位置后,再把轴元素回存入数组。
  (3)大数组采用快速排序,小数组直接用直接插入排序。一般认为数组元素数小于7,即为小数组。
  以下是完整代码,和改进后的快速排序代码,测试后都是正确的。

#include<iostream>
using namespace std;

void swap(int & i, int & j) {
	int temp = i;
	i = j;
	j = temp;
}

int partition(int array[],int first,int end) {
	while (first < end) {
		while (first < end && array[end] >= array[first])
			end--;
		if (first < end) {
			swap(array[first], array[end]);
			first++;
		}

		while (first < end && array[first] <= array[end])
			first++;
		if (first < end) {
			swap(array[first], array[end]);
			end--;
		}
	}

	return first;
}

void quickSort(int array[],int first,int end) {
	if (first >= end)
		return;

	int pivotIndex = partition(array,first,end);
	quickSort(array,first,pivotIndex - 1);
	quickSort(array,pivotIndex + 1,end);
}


void directInsert(int array[], int first, int end) {
	int tempKey;
	for (int i = first + 1; i <= end; i++) {
		tempKey = array[i];
		int j = i - 1;
		while (j >= 0 && array[j] > tempKey) {
			array[j + 1] = array[j];
			j--;
		}
		array[j + 1] = tempKey;
	}
}

int partitionBetter(int array[], int first, int end) {
	int mid = (first + end) / 2;
	if (array[first] > array[end])
		swap(array[first], array[end]);
	if (array[mid] > array[end])
		swap(array[mid], array[end]);
	if (array[mid] > array[first])
		swap(array[mid], array[first]);

	int pivotKey = array[first];
	while (first < end) {
		while (first < end && array[end] >= pivotKey)
			end--;
		if (first < end) {
			array[first] = array[end];
			first++;
		}

		while (first < end && array[first] <= pivotKey)
			first++;
		if (first < end) {
			array[end] = array[first];
			end--;
		}
	}
	array[first] = pivotKey;
	return first;
}

void quickSortBetter(int array[], int first, int end) {
	if (end - first > 6) {
		int pivotKey = partitionBetter(array, first, end);
		quickSortBetter(array, first, pivotKey - 1);
		quickSortBetter(array, pivotKey + 1, end);
	}
	else
		directInsert(array, first, end);
}

void dispaly(int array[], int length) {
	for (int i = 0; i < length; i++)
		cout << array[i] << ' ';
	cout << endl;
}

int main() {
	int length = 10;
	int a[] = {9,0,1,5,8,7,4,2,3,6};

	quickSort(a,0,length - 1);
//	quickSortBetter(a,0,length - 1);
	dispaly(a,length);
	
	return 0;
}

谢谢阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值