数据结构——快速排序算法

来源:互联网 发布:淘宝摄影培训 编辑:程序博客网 时间:2024/05/18 17:01

今天来说一说快速排序:

基本思想:

  1. 任取一个元素 (如第一个) 为轴点
  2. 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表
  3. 对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个

注意:

  • 每一趟的子表的形成是采用从两头向中间交替式逼近法
  • 由于每趟中对各子表的操作都相似,可采用递归算法

代码实现:

#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)—递归要用到栈空间

稳 定 性: 不稳定 —可选任一元素为支点。

0 0
原创粉丝点击