快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比不小于另外一部分的所有数据,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
1.C++实现
C++实现的代码:
#include
#include
using namespace std;
int calcute(int a[], int low, int high)
{
int pivortkey = a[low]; //用数组的第一个值作为比较的枢纽值
while (low < high) //直到low = high终止
{
while (pivortkey <= a[high] && low < high)
{
high--; //从数组的尾部向头部遍历数组数据
}
a[low] = a[high]; //将比pivortkey小的数放在前面
while (pivortkey >= a[low] && low < high)
{
low++; //从数组的头部向尾部遍历数组数据
}
a[high] = a[low]; //将比pivortkey大的数放在后面
}
a[low] = pivortkey; //将pivortkey放在low=high的位置(前小后大)
return low; //返回枢纽值所在的位置
}
void quicksort(int a[], int low, int high)
{
int index;
if (low >= high)
{
return; //单个分支调用结束时返回,递归的结束标志
}
if (low < high)
{
index = calcute(a, low, high); //将源数组以枢纽a[low]为界分两个分支
quicksort(a, low, index - 1); //递归调用,以枢纽为界:小于或等于枢纽值a[low]的分支
quicksort(a, index + 1, high); //递归调用,以枢纽为界:大于或等于枢纽值a[low]的分支
}
}
int main(int argc, char* argv[])
{
int a[10];
cout << "Please input 10 numbers:\n";
for (int i = 0; i < 10; i++)
{
cout << "The " << i << "th: ";
cin >> a[i]; //获取输入值,每输入一个值按enter结束
}
quicksort(a, 0, 9);
cout << "After quicksort:";
for (int i = 0; i<10; i++)
{
cout << a[i] << " "; //输出结果,以空格分隔
}
cout << endl;
return 0;
}
C++实现的输出结果:
2.R语言实现
R语言实现的代码:
quicksort <- function(x)
{
if (length(x) <= 1)
{
return(x) #终止条件
}
pivot <- x[1] #设定枢纽值
therest <- x[-1] #选取除去枢纽值的其余部分值
sv1 <- therest[therest < pivot] #小于枢纽值的部分值
sv2 <- therest[therest >= pivot] #不小于枢纽值的部分值
sv1 <- quicksort(sv1) #对分支sv1进行递归调用
sv2 <- quicksort(sv2) #对分支sv2进行递归调用
return (c(sv1, pivot, sv2)) #返回排序后的结果向量
}
总结:快速排序算法是排序算法中的基本算法之一,本文分别通过编译型语言C++和解释型语言R实现这种算法。两种语言都达到了目标,但从代码的简洁性上看,R语言略胜一筹。