著名排序法:快速排序
进入快序排序法之后,其实就很考验逻辑思考,所以其实我很少用快速排序或者是合并排序法。理由很简单,写起来很麻烦很啰唆,一不小心就会错很大。
不过该写还是要写,该复习还是要复习,所以今天来玩所谓的不稳定排序法:快速排序。
快速排序的动作如下
1. 决定一个基准点(中间、左边、或者右边)
2.假设你决定基准点在左边的话,那用 i 指标从基准点后一位开始找,找到比基准值大的数值停下
3.从阵列右边用 j 指标往回找,找到比基准值更小的值停下
4. 立刻判断 i 是否 大于 j ,i 如果大于 j 则进入 [j] 与 基准值的 大小判断,只要 [j] 比较小就互换
5. 承3.,如果 [i] 小于 [j],[i] 与 [j] 互换
6. recursive 呼叫,将范围切成从两份,第一份由0到 j,第二份由 j 到array.length-1(因为由零开始),并持续到 左边界条件 >= 右边界条件 为止。
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define SWAP(a,b){int temp = a;a=b; b=temp;}
const int size = 10;
void print_(int [], int);//ADT抽象资料型态大约这样表示
void QS(int [],int , int );
void QS(int a[],int L, int R)
{
int i=L+1;
int j=R;
while(i<j)
{
while(i!=R)
{
if(a[i]>a[L]){ break;}
else{ i=i+1;}
}
while(j!=L+1)
{
if(a[j]<a[L])
{
if(i>j){break;}///////////////////////////////
if(i<j){ SWAP(a[i],a[j]);}
break;
}
else{ j=j-1;}
}
if(i>=j)
{
if(a[j]<a[L])
{
SWAP(a[L],a[j]);
}
QS(a,L,j);
QS(a,j,R);
}
}
}
void main()
{
srand(time(NULL));
int arr[size] = {0};
for(int i = 0; i < size; i++) {
arr[i] = rand()%(100)+1 ;}
cout<<"阵列内容原始状况: "<<endl;
print_(arr,size);
QS(arr,0,size-1);
cout<<"\n"<<"排序之后阵列内容:"<<endl;
print_(arr,size);
system("pause");
}
void print_(int a[],int size)
{
for(int i=0; i<size;i++)
{
cout<<a[i]<<"\t";
}
}
//更新一下
这样应该就完全正确了ㄎㄎㄎ...