排序(三)-快速排序 [选取不同位置基准数]

//1.i = L; j = R; 将基准数挖出形成第一个坑a[i]。
//2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
//3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
//4.再重复执行2,3二步,直到i == j,将基准数填入a[i]中。
#include<iostream>
#include<algorithm>
using namespace std;
void insert_sort(int a[], int n) {       //插入排序
	int i, j;
	for (int i = 1; i < n; i++) {
		int tem = a[i];
		for (j = i; j > 0 && a[j - 1] > tem; j--)
			a[j] = a[j - 1];
		a[j] = tem;
	}
}
void qsort1(int a[], int left, int right)
{
	if (left < right) {
		int i = left, j = right, x = a[left];
		while (i < j) {
			while (i < j && a[j] >= x)
				j--;
			if (i < j)
				a[i++] = a[j];
			while (i < j && a[i] < x)
				i++;
			if (i < j)
				a[j--] = a[i];
		}
		a[i] = x;
		qsort1(a, left, i - 1);
		qsort1(a, i + 1, right);
	}
}

int getcenter(int a[], int left, int right)  //三个数取中位数快排
{
	int center = (left + right) / 2;
	if (a[left] > a[center])
		swap(a[left], a[center]);
	if (a[left] > a[right])
		swap(a[left], a[right]);
	if (a[center] > a[right])
		swap(a[center], a[right]);
	swap(a[center], a[right - 1]);
	return a[right - 1];
}
void qsort2(int a[], int left, int right)
{
	int cutoff = 500;
	if (cutoff <= right - left) {
	int pivot = getcenter(a, left, right);
	int i = left,j = right - 1;
	while (1) {
		while (a[++i] < pivot);
		while (a[--j] > pivot);
		if (j <= i)
			break;
		swap(a[i], a[j]);
	}
	swap(a[i], a[right - 1]);
	qsort2(a, left, i - 1);
	qsort2(a, i + 1, right);
	}
	else   // 否则用插入排序 
		insert_sort(a + left, right - left + 1);
}
int main() {
	int n;
	int a[1000001];
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	qsort2(a, 0, n - 1);
	for (int i = 0; i < n; i++) {
		if (i)cout << " ";
		cout << a[i];
	}
}
原文地址:https://www.cnblogs.com/Hsiung123/p/13109988.html