进入快序排序法之后,其实就很考验逻辑思考,所以其实我很少用快速排序或者是合并排序法。理由很简单,写起来很麻烦很啰唆,一不小心就会错很大。

不过该写还是要写,该复习还是要复习,所以今天来玩所谓的不稳定排序法:快速排序。

快速排序的动作如下

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";
  }
}

 

//更新一下
这样应该就完全正确了ㄎㄎㄎ... 

相关文章