您的位置:首页 > 编程语言 > C语言/C++

c++快速排序的过程

2013-12-28 10:18 393 查看
本文是做数据结构的实验时的总结
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;

}

这是我的体会,希望大家多多指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: