快速排序,二路排序,三路排序

快速排序:首先确定一个基点,定义一个指针指向已经确定的小于基点的最有一个元素。从左到右处理数组

#include<iostream>
using namespace std;
//单路快拍,从左到右依次遍历
int danluswap(int array[], int l, int r) {
	int j = l;
	int v = array[l];
	for (int i = l + 1; i <=r; i++) {
		if (array[i] <= v) {
			j++;
			int t = array[j];
			array[j] = array[i];
			array[i] = t;				
		}
	}
	int t = array[j];
	array[j] = v;
	array[l] = t;
	return j;
}
void _quicksort(int array[], int l, int r) {
	int index = danluswap(array, l, r);
	if(l<index-1)
	_quicksort(array, l, index - 1);
	if(index+1<r)
	_quicksort(array, index + 1, r);
}

void quicksort(int array[], int n) {
	_quicksort(array, 0, n - 1);
}
int main() {
	int n;
	cin >> n;
	int array[100];
	for (int i = 0; i < n; i++) {
		cin >> array[i];
	}
	quicksort(array, n);
	return 0;
}

二路快排:首先确定一个基点,再使用两个指针分别指向首尾,记录比基点小或等于的元素和比基点大的元素 (实现方法不一样,前后元素交换位置)

#include<iostream>
using namespace std;
//双路快排,从两边同时遍历元素,对换前后元素位置
int shuangluswap(int array[], int l, int r)
{
	int i = l+1;
	int j = r;
	int v = array[l];
	while (i <= j) {
		while (i <= j && array[i]<=v) {
			i++;
		}
		while (i <= j && array[j] > v) {
			j--;
		}
		if (i >= j) {
			break;
		}
		int t = array[i];
		array[i] = array[j];
		array[j] = t;
	}
	array[l] = array[j];
	array[j] = v;
	return j;
}

void _shuanglusort(int array[], int l, int r) {
	int index = shuangluswap(array, l, r);
	if (l < index - 1)
		_shuanglusort(array, l, index - 1);
	if (index + 1 < r)
		_shuanglusort(array, index + 1, r);
}

void shuanglusort(int array[], int n) {
	_shuanglusort(array, 0, n - 1);
}
int main() {
	int n;
	cin >> n;
	int array[100];
	for (int i = 0; i < n; i++) {
		cin >> array[i];
	}
	shuanglusort(array, n);
	return 0;
}

三路快排:首先确定一个基点,再使用两个指针分别指向首尾,记录比基点小的元素和比基点大的元素 ,中间是与基点相同的元素。(实现方法更加类似于一路快排)

#include<iostream>
using namespace std;

//三路排序,在一路排序的基础上将较大的元素放在数组后面,将数组分为3端,<v , ==v ,>v,使用两个指针从头和从尾开始遍历


void _sanlusort(int array[], int l, int r) {
	int lt = l;
	int gt = r+1;
	int i = l+1;
	int v = array[l];
	while (i < gt) {
		if (array[i] == v) {
			i++;
		}
		else if (array[i] > v) {
			gt--;
			int tt = array[gt];
			array[gt] = array[i];
			array[i] = tt;
		}
		else {
			lt++;
			int tt = array[lt];
			array[lt] = array[i];
			array[i] = tt;
			i++;//此时的array[lt]==v,所以i++
		}
	}
	array[l] = array[lt];
	array[lt] = v;


	if (l < (lt - 1)) {
		_sanlusort(array, l, lt - 1);//array[lt]==v,所以不需要
	}
	if (r > (gt + 1)) {
		_sanlusort(array, gt, r);
	}
}


void sanlusort(int array[], int n) {
	_sanlusort(array, 0, n - 1);
}

int main() {
	int n;
	cin >> n;
	int array[100];
	for (int i = 0; i < n; i++) {
		cin >> array[i];
	}
	sanlusort(array, n);
	return 0;
}
发布了10 篇原创文章 · 获赞 3 · 访问量 296

猜你喜欢

转载自blog.csdn.net/qq_32227619/article/details/105588070