快速排序:首先确定一个基点,定义一个指针指向已经确定的小于基点的最有一个元素。从左到右处理数组
#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;
}