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;
}
这是我的体会,希望大家多多指正。
- c++快速排序的过程
- 快速排序过程的优化
- 快速排序的过程java
- 快速排序的c实现
- 快速排序的c实现
- c语言的快速排序
- 快速排序过程的优化(续)
- 快速排序算法的算法过程
- 排序-快速排序(c)
- 快速排序--过程详解
- 快速排序 过程图解
- 数据结构(C#)--冒泡、插入、快速、堆、归并、希尔、选择各种排序排序过程比较以及各种排序的所用时间的对比
- 快速排序的c语言程序
- C/C++ qsort()快速排序的用法
- 我的C语言快速排序方法
- C/C++ qsort()快速排序的用法
- 快速排序的C语言代码实现
- 快速排序的C语言代码实现
- mssql中SQL语句优化常用方法小结
- java小笔记----awt 使用自定义字体
- Implement strStr()
- spring 定时器时间配置
- jQuery CSS选择器
- c++快速排序的过程
- Servlet实践一
- javascript学习
- some helpfuf web sit about tower defense game
- mysql 数据库配置
- 且让生命细水长流
- 云盘上传为什么这么快
- 开机进入grub
- java基础中一些值得聊的话题(可以当做面试题)