快速排序
时间复杂度:最好时间O(nlogn) 最坏时间O(n^2)
稳定性:不稳定 快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现方法:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,
所有比它大的数都放到它后面,这个过程称为一趟快速排序。
//代码实现:
#include <stdio.h>
#include <stdlib.h>
//实现交换
void Swap(int a[] ,int low ,int high)
{
int tmp;
tmp=a[low];
a[low]=a[high];
a[high]=tmp;
}
/**************************************************************************
函数名:partition()
功能: 计算基准点的函数,并将小于基准点的元素放于基准点的左边,大于基准点的数放于基准点右边
输入参数: int a[]:待排序的数组
int low:数组的起始位置
int high:数组的结束位置
返回值:int 基准点
***************************************************************************
*/
int partition(int a[],int low,int high)
{
int point;
//基准点定位为第一个元素
point=a[low];
while( low < high)
{
//将大于基准点的数放于基准点的右边
while( low < high && a[high] >= point )
high--; //移到前一个元素
//当不满足大于基准点,交换基准点
Swap(a,low,high);
//将小于基准点的数放于基准点的左边
while( low < high && a[low] <= point)
low++; //移到下一个元素
//当不满足小于基准点,交换基准点
Swap(a,low,high);
}
return low;//返回的中间点,当退出循环后low 与high指向同一个元素
}
//low 为数组起始位置 high为数组的结束位置
void QSort(int a[],int low,int high)
{
int point;//定义变量存放基准点
if( low < high )
{
point=partition(a,low,high);//对基准点定位
//对基准点左边进行递归调用
QSort(a,low,point-1);
//对基准点右边进行递归调用
QSort(a,point+1,high);
}
}
//外层函数,由于快速排序需要三个参数,为零满足只要两个参数,定义一个外层函数调用实际操作的函数
void QuickSort(int a[],int len)
{
//调用实际操作的函数
QSort(int a[],0,len-1);
}
int main(int argc, char const *argv[])
{
int array[]={123,456,12,3,456};
QuickSort(array,5);
int i;
for(i=0;i<5;i++)
{
printf("%d ",array[i]);
}
return 0;
}