c++快速排序的過程

本文是做數據結構的實驗時的總結

1.總的來說,快速排序也是一種遞歸,其中就是不斷地重複,選出第一個數爲主要的數pivot,把一個數組不斷地分成左右兩半,pivot在中間,但是其中pivot比左邊的所有數大,比右邊的所有數小。其中把他分成兩部分的算法下面寫。

2.遞歸的實現如下:

template<class T>
void DataList<T>::QuickSort(const int left,const int right)
{
if(left<right)
{
int pivotpos = Partition(left,right);//首先執行分成兩部分的函數,返回pivotpos。
QuickSort(left,pivotpos-1);//執行pivot左邊的又分成兩部分,一樣遞歸調用
QuickSort(pivotpos+1,right);//執行右邊的部分
}
}

3.分成兩半的算法如下:

比如一組數:12 23 3 43 3 23 

剛開始pivot,pivotpos是等於第一個是12

則我們就選pivot爲主軸(就是分成左右兩部分的中間數),然後data【i】爲逐個訪問數組中的數,當data【i】小於pivot時,

則pivotpos指向下一個數和data【i】交換(swap函數),這個目的是爲了把所有數組中小於pivot的數放到同一塊,i遍歷完了之後就把pivot和data【pivotpos】交換,這時第一個把數組分成兩邊的回合就完成了。

!注意:在比較data【i】和pivot的數十要判斷i和pivotpos是否相等,如果相等就不用執行交換了。

template<class T>
int DataList<T>::Partition(int low,int high)
{
int pivotpos = low;int pivot = data[low];
int i=low+1;
while(i<=high)                                             
{
       if(data[i]<pivot)
   {
   pivotpos++;
   if(i!=pivotpos)
   Swap(data[pivotpos],data[i]);
   }
   i++;
}
data[low]=data[pivotpos];data[pivotpos]=pivot;
return pivotpos;
}

4.下面是個完整的代碼

//放到Datalist.h的頭文件中

#ifndef DATALIST
#define DATALIST
#include<iostream.h>
#include <stdlib.h>
const int defaultSize=100;
template<class T>
class DataList
{
protected:
T *data;
int Maxsize;
int last;
void reSize(int newSize);
public:
DataList(int sz);
~DataList(){delete []data;}
bool Insert(T& x);
bool ReadData();
void QuickSort(const int left,const int right);
int Partition(const int low,const int high);
int GetAll(){return last;}
void Swap(int&a,int&b);
void UseQuickSort(){QuickSort(0,last);}
};


template <class T>
DataList<T>::DataList(int sz)
{
if(sz>0)
{
Maxsize=sz;
data=new T[Maxsize];
   last=-1;
if(data == NULL)
{cerr<<"內存分配錯誤!"<<endl;exit(1);}
}
}


//插入一個數的算法
template<class T>
bool DataList<T>::Insert(T& x)
{
if(last==Maxsize-1) {cout<<"內存不夠!"<<endl;exit(1);}
last++;
data[last]=x;
return true;
}


template<class T>
bool DataList<T>::ReadData()
{
for(int i=0;i<=last;i++)
cout<<data[i]<<"  ";
cout<<endl;
return true;
}


//快速排序的算法
template<class T>
void DataList<T>::QuickSort(const int left,const int right)
{
if(left<right)
{
int pivotpos = Partition(left,right);
QuickSort(left,pivotpos-1);
QuickSort(pivotpos+1,right);
}
}


//把數按左小右大
template<class T>
int DataList<T>::Partition(int low,int high)
{
int pivotpos = low;int pivot = data[low];
int i=low+1;
while(i<=high)
{
       if(data[i]<pivot)
  {
  pivotpos++;
  if(i!=pivotpos)
  Swap(data[pivotpos],data[i]);
  }
  i++;
}
data[low]=data[pivotpos];data[pivotpos]=pivot;
return pivotpos;
}


template<class T>
void DataList<T>::Swap(int& a,int& b)
{
int term;
term = a;
a=b;
b=term;


#endif

//放到主文件中的quicksort.cpp中

#include<iostream.h>
#include "DataList.h"
int main(int argc,char *argv[])
{
int a;
DataList<int> num(50);
cout<<"請輸入你要加入到數組中的數(輸入0結束):"<<endl;
cin>>a;
while (a!=0)
{
num.Insert(a);
cin>>a;
}
cout<<"輸出數組中的數:"<<endl;
num.ReadData(); 
//執行快速排序
num.UseQuickSort();
cout<<"輸出數組中的數:"<<endl;
num.ReadData();
return 0;
}

這是我的體會,希望大家多多指正。

發佈了21 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章