今天来说一说快速排序:
基本思想:
- 任取一个元素 (如第一个) 为轴点
- 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表
- 对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个
注意:
- 每一趟的子表的形成是采用从两头向中间交替式逼近法
- 由于每趟中对各子表的操作都相似,可采用递归算法
代码实现:
#include <iostream>
using namespace std;
//找到第一个轴点,以这个轴点为界,将待排序的数组划分为
//[low,pivot),[pivot],(pivot,high]三部分
int Partition(int a[], int low, int high)
{
if( low > high )//判断非法条件
return -1;
int pivot = a[low];//将轴点默认为数组的第一个元素a[low](备份)
while (low < high)//从数组的两端 交替地 向中间扫描
{
while (low < high && pivot <= a[high])//在不小于pivot的前提下
{
high--;//向左拓展右端子序列
}
a[low] = a[high];//小于pivot的值归入左侧子序列
while (low < high && pivot >= a[low])//在不大于pivot的前提下
{
low++;//向右拓展左端子序列
}
a[high] = a[low];//大于pivot的的值归入右侧子序列
}
a[low] = pivot;//将备份的轴点记录置于左、右子序列之间
return low;//返回轴点的下标
}
//快排算法(递归)
void QuickSort(int a[], int low, int high)
{
if (high - low < 2)//只有一个值是默认有序的,不必再进行排序
{
return;
}
int key = Partition(a,low,high);//找到轴点的下标
QuickSort(a,low,key-1);//递归进行排序。一旦找到轴点就可以确定这个轴点
QuickSort(a,key+1,high);//的位置就是排序后的的位置,所以不必再进行排序。
}
/*------测试代码------*/
int main()
{
//int a[] = {1,2,4,3,12,45,2,54,6,32,44};
int a[] = {21,21,54,6,3,44,5,5,65,33};
int La = sizeof(a)/sizeof(a[0]) - 1;//这里必须减一,因为数组下标是从0开始的,否则会造成数组越界
QuickSort(a,0,La);
for (int i =0; i <= La; i++)
{
cout<<a[i]<<endl;
}
return 0;
}
输出结果:
时间效率: O(nlog2n) —每趟确定的元素呈指数增加
空间效率: O(log2n)—递归要用到栈空间
稳 定 性: 不稳定 —可选任一元素为支点。
时间: 2024-12-25 12:40:04