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;
}
这是我的体会,希望大家多多指正。
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;
}
这是我的体会,希望大家多多指正。
相关文章推荐
- C++快速排序之sort()
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 每天一个C++小程序(十五)--快速排序
- 2018年第九届蓝桥杯【C++省赛B组】【第五题:快速排序】
- 【C++】冒泡排序、插入排序、快速排序
- 交换排序——冒泡排序和快速排序,C++代码实现
- C++ 快速排序
- 每天一个c++小程序(1):快速排序
- 快速排序--过程详解
- 霍尔快速排序 非递归 C++实现
- 快速排序c++原代码
- 快速排序partition过程常见的两种写法+快速排序非递归实现
- 快速排序 c++ 实现
- C++ 快速排序 递归实现
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析
- C++快速排序、归并排序
- C++排序:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
- 直接查找排序,归并排序,快速排序,计数排序 ,堆排 C++实现
- C++实现快速排序
- 快速排序的C++实现