您的位置:首页 > 理论基础 > 数据结构算法

数据结构之快速排序

2009-05-16 15:54 447 查看
#include <iostream>
using namespace std;
//  快速排序的实现基于分治法,具体分为三个步骤。假设待排序的序列为L[m..n]。
//  分解:序列L[m .. n]被划分成两个可能为空的子序列L[m .. pivot-1]和L[pivot+1 .. n],
//          使L[m .. pivot-1]的每个元素均小于或等于L[pivot],同时L[pivot+1.. n]的每个元素均大于L[pivot]。
//          其中L[pivot]称为这一趟分割中的主元(也称为枢轴、支点)。
//  解决:通过递归调用快速排序,对子序列L[m .. pivot-1]和L[pivot+1 .. r]排序。
//  合并:由于两个子序列是就地排序的,所以对它们的合并不需要操作,整个序列L[m .. n]已排好序。

//算法在最坏的情况下运行时间为O(n^2),
//但由于平均运行时间为O(nlogn),
//并且在内存使用、程序实现复杂性上表现优秀,
//尤其是对快速排序算法进行随机化的可能,
//使得快速排序在一般情况下是最实用的排序方法之一。

//快速排序
void quick_sort(int a[],int low, int high)
{
int i,j,pivot;
if (low < high)
{
pivot = a[low];
i = low;
j = high;
while (i < j)
{
//从顶端开始比较值,如果小于标准值,停止
while (i < j && a[j] >= pivot)
{
j--;
}
//将比pivot小的元素移到低端,下标加加
if (i < j)
a[i++] = a[j];
//从底端开始比较值,如果大于标准值,停止
while (i < j && a[i] <= pivot)
{
i++;
}
//将比pivot大的元素移到顶端,下标减减
if (i < j)
a[j--] = a[i];
}
//pivot移动到最终位置
a[i] = pivot;
//对左区间进行递归排序
quick_sort(a, low, i-1);
//对右区间进行递归排序
quick_sort(a, i+1, high);
}

}
void print_array(int a[], int n)
{
for(int i = 0; i < n; i++)
{
cout << a[i] << ",";
}
}

int main()
{
int data[9] = {54,38,96,23,15,72,60,45,83};
quick_sort(data, 0, 8);
print_array(data,9);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: