一、该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
二、图说:
三、为什么采用快速排序?
首先快速排序的稳定度并不高,快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。
代码实现:
//快速排序.cpp:定义控制台应用程序的入口点。
//作者:Hacker.ST.Tan
#include"stdafx.h"
#include<iostream>
#include<time.h>
#include<windows.h>
#define MAX 10
void QuickSort(int Array[], int left, int right);
void Output(int Array[], int Length);
void Ran_Array(int Array[], int Length);
int main(){
int Array[MAX];
int Length = sizeof(Array) / sizeof(int);
printf("产生的随机数组为:\n");
Ran_Array(Array, Length);
Output(Array, Length);
printf("排序后为:\n");
QuickSort(Array, 0, Length - 1);
Output(Array, Length);
system("pause");
return 0;
}
/*基于分治法,快速排序*/
void QuickSort(int Array[], int left, int right){
if (left > right)
return;
int i, j, temp, t;
temp = Array[left];//基准数获取
i = left; j = right;//侦察兵
//当i=j时,Array[i]、Array[i]指向同一个位置,本趟排序结束
while (i != j){
//从右边开始找,注意:“侦察兵”j先动,如果j找到比基数大的值,停下,等待i找到比基数小的值
while (Array[j] >= temp&&i < j)
--j;
//再从左边开始找,如果i找到比基数大的值,停下
while (Array[i] <= temp&&i < j)
++i;
//然后交换找到的两个数的位置
if (i < j){
t = Array[i];
Array[i] = Array[j];
Array[j] = t;
}
}
//最终将基数归位,基数位于中间
Array[left] = Array[i];
Array[i] = temp;
/*再分治*/
QuickSort(Array, left, i - 1);//左侧递归
QuickSort(Array, i + 1, right);//右侧递归
}
//随机数组
void Ran_Array(int Array[], int Length){
srand((unsigned)time(NULL));
for (int i = 0; i < Length; ++i){
int j;
int temp = rand() % 100;
for (j = 0; j < i; ++j){
if (Array[j] == temp){
--i;
break;
}
}
if (j >= i)
Array[i] = temp;
}
}
//输出
void Output(int Array[], int Length){
for (int i = 0; i < Length; ++i)
printf("%d ", Array[i]);
printf("\n");
}