一.概述
(1)快速排序是一种交换排序,通过一趟排序将要排序的数据分割成独立的两部分: 分割点边都是比它小的数,右边都是比它大的数。它由C. A. R. Hoare在1962年提出。
二.算法思想
1)通过一趟排序将要排序的数据分割成独立的两部分:分割点边都是比它小的数,右边都是比它大的数 (2)按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设一组无序的数组:2、4、5、1、3
三.代码实现
/*
From:mohican
Date: 2019.1.11
*/
#include<iostream>
#define SIZE 10
using namespace std;
//快速排序 根据基准元素 来排序
//一趟快速排序过程 ---》与基准进行比较
//递归寻找基准的过程
//寻找基准 一趟快速排序的过程
int Partion(int *arr, int left ,int right)
{
int L = left ;
int R = right;
int par = 0;
int base = 0;
while(L< R)
{
base = arr[L];
//第一步 从右向左扫描 比base小,与left交换
while ((L< R) && (arr[R]>=base))
{
--R;
}
if(arr[R] <base)
{
arr[L] = arr[R];
}
//第二步,从左向右扫面,比base大,与right 交换
//left == right 返回par;
while ( (L< R) && (arr[L]<=base))
{
++L;
}
if(arr[L]>base)
{
arr[R]=arr[L];
}
arr[L] = base;
}
par = L;
return par;
}
//递归每次找基准 保证左右两边两个数据以上
void Quick(int *arr,int start,int end)
{
int par = Partion(arr,start,end);
//如果左边有两个数据以上
if(par>start+1)
{
Quick(arr,start,par-1);
}
//如果右边还有两个数据以上
if(par<end-1)
{
Quick(arr,par+1,end);
}
return ;
}
void QuickSort(int *arr,int len)
{
Quick(arr,0,len-1);
}
void Show(int *arr,int len)
{
for(int i =0;i<len;++i)
{
cout<<arr[i]<<" ";
}
}
int main()
{
cout<<"Please input number ! SIZE ="<<SIZE<<endl;
int *arr= new int[SIZE] ;
for(int i = 0;i<SIZE;++i)
{
cin>>arr[i];
}
int len = SIZE;
QuickSort(arr,len);
Show(arr,len);
system("pause");
return 0;
}
四.时间复杂度 和 空间复杂度
快速排序中:
相同元素可能会因为分区,而进行交换,所以是稳定性最差的排序方法
当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,效率最差; 随机分布时,第一个关键字为基准分两个子序列,两个子序列的元素数接近,效率最好。