#include
using namespace std;
class Sort {
public:
Sort (int r[],int n); //构造函数,生成待排序序列
~Sort();//析构函数
void InsertSort();//直接插入排序
void ShellSort();//希尔排序
void BubbleSort();//起泡排序
void QuickSort (int first,int last); //快速排序
void SelectSort();//简单选择排序
void Print();//输出序列
private:
int Partition (int first,int last); //快速排序,一次划分
int *data;//待排序序列
int length;
};
Sort::Sort (int r[],int n) {
data=new int[n];
for (int i=0; i<n; i++) {
data[i]=r[i];
length=n;
}
}
Sort::~Sort() {
delete[] data;
}
void Sort::Print() {
for (int i=0; i<length; i++) {
cout<<data[i]<<" ";
}
}
void Sort::InsertSort() {
int i,j,temp;
for (i=1; i<length; i++) {
temp=data[i];//暂存待插入记录
for (j=i-1; j>=0&&temp<data[j]; j–) { //寻找插入位置
data[j+1]=data[j];
}
data[j+1]=temp;
}
}
void Sort::ShellSort() {
int temp,d,i,j;
for (d=length/2; d>=1; d=d/2) { //增量为d进行直接插入排序
for (i=d; i<length; i++) { //进行一趟希尔排序
temp=data[i];//暂存待插入记录
for (j=i-d; j>=0&&temp<data[j]; j=j-d) {
data[j+d]=data[j];//记录后移d个位置
}
data[j+d]=temp;
}
}
}
void Sort::BubbleSort() {
int j,exchange,bound,temp;
exchange=length-1;//第一趟起泡排序区间是[0~length-1]
while (exchange!=0) {
bound=exchange;
exchange=0;
for (j=0; j<bound; j++) //一趟起泡的区间是[0~bound]
if (data[j]>data[j+1]) {
temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
exchange=j;//记载每一次记录交换的位置
}
}
}
int Sort::Partition (int first,int last) {
int i=first,j=last,temp;//初始化一次划分的区间
while (i<j) {
while (i<j&&data[i]<=data[j]) { //右侧扫描
j–;
}
if (i<j) {
temp=data[i];
data[i]=data[j];
data[j]=temp;
i++;
}
while (i<j&&data[i]<=data[j]) { //左侧扫描
i++;
}
if (i<j) {
temp=data[i];
data[i]=data[j];
data[j]=temp;
j–;
}
}
return i;//i为轴值记录的最终位置
}
void Sort::QuickSort (int first,int last) {
if (first>=last)
return;//区间长度为1,递归结束
else {
int pivot=Partition (first,last); //一次划分
QuickSort (first,pivot-1); //对左侧子序进行快速排序
QuickSort (pivot+1,last); //对右侧子序进行快速排序
}
}
void Sort::SelectSort() {
int i,j,index,temp;
for (i=0; i<length-1; i++) { //进行length-1趟简单选择排序
index=1;
for (j=i+1; j<length; j++) { //在无序区中选取最小记录
if (data[j]<data[index])
index=j;
}
if (index!=i) {
temp=data[i];
data[i]=data[index];
data[index]=temp;
}
}
}
int main() {
int select,r[10]= {12,15,11,17,19,14,13,16,15,18};
Sort s (r,10);
cout<<“1.直接插入排序 2.希尔排序”<<endl;
cout<<“3.起泡排序 4.快速排序”<<endl;
cout<<“5.简单选择排序”<<endl;
cout<<“请输入需要使用的排序方法:”;
cin>>select;
switch (select) {
case 1:
s.InsertSort();
break;
case 2:
s.ShellSort();
break;
case 3:
s.BubbleSort();
break;
case 4:
s.QuickSort(0,9);
break;
case 5:
s.SelectSort();
break;
default:
cout<<“输入排序编号错误”<<endl;
break;
}
s.Print();
return 0;
}
本文介绍了一种排序类Sort,包含了直接插入排序、希尔排序、起泡排序、快速排序和简单选择排序的实现。通过选择不同的排序方法,用户可以对给定的序列进行排序操作,并在完成排序后输出排序结果。
39万+

被折叠的 条评论
为什么被折叠?



