c++快速排序的过程

来源:互联网 发布:qq钓鱼软件生成器 编辑:程序博客网 时间:2024/06/05 17:06

本文是做数据结构的实验时的总结

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

这是我的体会,希望大家多多指正。

0 0
原创粉丝点击