一 快速排序
排序算法中的奥斯卡,诺贝尔奖,当属快速排序!
快速排序是20世纪十大算法之一!!!!!!!!
1 基本思想
前面提到冒泡排序,它是一种交换排序,堪称最慢的排序算法。可是,物极必反,快速排序是冒泡排序的升级加强版,同属于交换排序类。
以”空间“换时间,快速排序不是相邻元素的交换,而是加大了比较和交换的距离,从而减少总的比较次数和移动交换次数。就拿考试分数来说,首先,60分几个,我们以60分为标准,从一堆分数中高于60扔一堆,低于60仍另一堆,管你第一还是倒数,然后80分以上优秀,我们就在60分以上的那一堆中,以80分为标准,高于80甩一边,低于80你可以走了,你不是优秀学生。这样一来我们反复进行这样的划界,分类,不断缩小标准之间的差,这样就得到了一个按序排列的分数表了。
2.实现
真枪实弹来演练一下快速排序算法,下面看具体的代码实现:
首先是快速排序的主体:
void Quick_Sort(SortArray *A , int low , int high)
{
if (low < high) //low == high代表只有一个数了,此时退出循环
{
int mid = Partition(A , low ,high); //每次得到划分的标准
//递归
Quick_Sort(A , low ,mid-1); //分成两堆继续递归循环
Quick_Sort(A, mid +1 , high);
}
}
算法中最重要的是Partition部分,就是选取标准,然后分成两堆。
int Partition(SortArray *A , int low ,int high)
{
int temp = (*A)[low];
while ( low < high)
{
//将比temp值小的数换到数组的低端
while ( low < high && (*A)[high] >= temp)
{
high--; //如果比temp大则不替换
}
if (low < high) //比temp小则替换
{
(*A)[low] = (*A)[high]; //此处由于已将A[low]的值赋给temp,所以可以不必替换而是直接修改
low++;
}
//将比temp值大的数换到数组的高端
while ( low < high && (*A)[low] <= temp)
{
low++; //如果比temp小则不替换
}
if (low < high) //比temp大则替换
{
(*A)[high] = (*A)[low];
high--;
}
}//最后low==high则推出循环
//此处将temp值传递到中间被修改的值上
(*A)[low] = temp;
return low;
}
对于快速排序的优化主要是针对Partition函数体的优化,如何选择这个”标准“,有兴趣的可以研究一下,说不定你的算法就是下一个”十大算法“
下面附上主程序:
#include <stdio.h>
#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAX 100
typedef int SortArray[MAX];
int _tmain(int argc, _TCHAR* argv[])
{
int n ;
SortArray A; cout<<"/**排序**/\n"
<<"请输入数组个数"<<endl;
cin>>n;
cout<<"请输入待排序数组"<<endl;
for (int i = 0 ; i < n ; i++)
{
cin>>A[i];
}
cout<<"正在排序请稍后....."<<endl;
Quick_Sort(&A , 0 , n-1);
cout<<"排序结果如下....."<<endl;
for (int i = 0 ; i < n ; i++)
{
cout<<A[i]<<endl;
}
system("pause");
return 0;
}