快速排序法和冒泡排序法有点类似,都是通过交换数据来进行排序,但是快速排序法对冒泡排序法进行了改进,所以效率也就更高。
快速排序法流程:
1、首先对待排序的数据进行分割划界,分界值随便取,关键是要把数据分成两部分;
2、然后将左、右两边的数据同时跟分界值进行比较,把大于分界值的数据放在右边,小于的数据放在左边,如果比较的过程中,有不符合排序标准的数据就行交换,一共就三种情况(a:只有左边不符合,就把不符合的数据与分界值交换;b:只有右边不符合,就把右边的数据与分界值交换;c:如果左右两边都不符合,就把左右两边不符合的数据进行交换),数据较多就一直交换,直到到达分界值(也就是左右两边的数据都跟分界值比较完了);
3、然后把分界值左右两边的数据按上面的方法进行分割比较,不断重复,当左右两边的数据都排好之后,整个排序也就完成了。
假设有N个数字:
1 6 3 2 5 4
第一步:取下标为N/2处的值为分界值,也就是2,然后将2左边的1 6 3以及右边的5 4同时与2进行比较,小的放在左边,大的放在右边;
1 2 3 6 5 4
第二步:2左边只有1,所以将2 3 6 5 4进行分界,6为分界值,同样小的放左边大的放右边;
1 2 3 4 5 6
这里已经排好了,只需要加个判断。
【核心代码】
void QuickSort(int *arr,int left,int right)
{
int f, t;
int rtemp, ltemp;
ltemp = left;//数组第一个
rtemp = right;//数组最后一个
f = arr[(left+right)/2];//从中间分开,f为中间值
while(ltemp<rtemp)//保证至少有两个数,并且
{
while (arr[ltemp]<f)//保证arr[ltemp]只能在f的左边
{
++ltemp;//此时的arr[ltemp]>f,需要交换
}
while (arr[rtemp]>f)//保证arr[rtemp]只能在f的右边
{
--rtemp;//此时的arr[rtemp]<f,需要交换
}
if (ltemp<=rtemp)//交换位置
{
t = arr[ltemp];
arr[ltemp] = arr[rtemp];
arr[rtemp] = t;
--rtemp;
++ltemp;
}
}
if (ltemp == rtemp)//刚好碰到与分界值交换
{
ltemp++;
}
if (left<rtemp)
{
QuickSort(arr,left,ltemp-1);//无限调用,无限分割
}
if (ltemp<right)
{
QuickSort(arr, rtemp + 1,right);//无限调用,无限分割
}
}
【完整代码】
// c++之快速排序算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
//#define SIZE 18
void QuickSort(int *arr,int left,int right)
{
int f, t;
int rtemp, ltemp;
ltemp = left;//数组第一个
rtemp = right;//数组最后一个
f = arr[(left+right)/2];//从中间分开,f为中间值
while(ltemp<rtemp)//保证至少有两个数,并且
{
while (arr[ltemp]<f)//保证arr[ltemp]只能在f的左边
{
++ltemp;//此时的arr[ltemp]>f,需要交换
}
while (arr[rtemp]>f)//保证arr[rtemp]只能在f的右边
{
--rtemp;//此时的arr[rtemp]<f,需要交换
}
if (ltemp<=rtemp)//交换位置
{
t = arr[ltemp];
arr[ltemp] = arr[rtemp];
arr[rtemp] = t;
--rtemp;
++ltemp;
}
}
if (ltemp == rtemp)//刚好碰到与分界值交换
{
ltemp++;
}
if (left<rtemp)
{
QuickSort(arr,left,ltemp-1);//无限调用,无限分割
}
if (ltemp<right)
{
QuickSort(arr, rtemp + 1,right);//无限调用,无限分割
}
}
int main()
{
using namespace std;
int i;
int SIZE;
cout << "请输入待排序的数字的个数:";
cin>>SIZE;
int *shuzu = new int[SIZE];
//int shuzu[SIZE];
srand(time(NULL));
for (i=0;i<SIZE;i++)
{
shuzu[i] = rand() / 1000;
}
printf("排序前:\n");
for (i=0;i<SIZE;i++)
{
printf("%d ",shuzu[i]);
}
printf("\n");
QuickSort(shuzu,0,SIZE-1);
printf("排序后:\n");
for (i=0;i<SIZE;i++)
{
printf("%d ",shuzu[i]);
}
printf("\n");
system("pause");
return 0;
}
【演示结果】