您的位置:首页 > 理论基础 > 数据结构算法

数据结构八种排序方法作业示例(无讲解)

2015-01-23 09:43 141 查看
#include <cstdio>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <fstream>
using namespace std;

class insertSort{
public:
insertSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~insertSort(){
delete b;
}

void sort(){
for(int i =0;i<size;i++)b[i] =a[i];
swapTime = 0;
compTime = 0;
start = time(&start);
for(int i = 0;i<size; i++){
//  printf("%d\n",a[i]);
//  int minind = i;
int j = i;
for(j = i-1;j>=0;j--){
compTime++;
if(b[j]<=b[i]){
break;
}
}
if(b[j]<=b[i]||j<0)j++;//要插入位置
int tmp = b[i];
for(int k = i;k>j;k--){
b[k] = b[k-1];
swapTime ++;
}
b[j] = tmp;
}
stop= time(&stop);
}

void print(){
puts("1 直接插入排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

class halfInsertSort{
public:
halfInsertSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~halfInsertSort(){
delete b;
}

void sort(){
for(int i=0;i<size;i++)b[i]=a[i];
swapTime = 0;
compTime = 0;
start = time(&start);
for(int i = 0;i<size; i++){
int l=0,r=i;
while(r-l>1){
int mid = (l+r)>>1;
if(b[mid] > b[i]){
r = mid;
}
else {
l = mid;
}
compTime++;
}
if(b[l]<=b[i])l++;
int tmp = b[i];
for(int k = i;k>l;k--){
b[k]=b[k-1];
swapTime ++;
}
b[l]=tmp;
}
stop= time(&stop);
}

void print(){
puts("2 折半插入排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

class shellSort{
public:
shellSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~shellSort(){
delete b;
}

void sort(){
for(int i =0;i<size;i++)b[i] =a[i];
swapTime = 0;
compTime = 0;
start = time(&start);

int times = int(log2(size+1));
for(int i = 1;i <=times;i++){
int d = int(pow(2,times-i+1)-1);
for(int j = 0;j < size;j++){
int tmp = b[j];
int k;
for(k= j-d;k>=0&&++compTime&&b[k]>tmp;k-=d){
b[k+d] = b[k];swapTime++;
}
k+=d;
b[k] = tmp;
}
}

stop= time(&stop);
}

void print(){
puts("3 Shell排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

class bubbleSort{
public:
bubbleSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~bubbleSort(){
delete b;
}

void sort(){
for(int i =0;i<size;i++)b[i] =a[i];
swapTime = 0;
compTime = 0;
start = time(&start);
for(int i = 0;i<size; i++){
for(int j = size - 1;j > i; j--){
compTime++;
if(b[j]<b[j-1]){
swap(b[j-1],b[j]);
swapTime+=3;
}
}
}
stop= time(&stop);
}

void print(){
puts("4 冒泡排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

class quickSort{
public:
quickSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~quickSort(){
delete b;
}
void partition2(int s,int t){
int low = s,high = t;
int key = b[s];
while(low < high){
while(low<high&&high--&&b[high] >= key){compTime++;}
if(low==high)break;
b[low] = b[high];
swapTime++;
while(low<high&&low++&&b[low]<=key){compTime++;}
if(low==high)break;
b[high] = b[low];
swapTime++;
}
b[low] = key;
if(low>s+1)partition2(s,low);
if(low+1<t)partition2(low+1,t);
}
void sort(){
for(int i =0;i<size;i++)b[i] =a[i];
swapTime = 0;
compTime = 0;
start = time(&start);

partition2(0,size);

stop= time(&stop);
}

void print(){
puts("5 快速排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

class simpleSelectSort{
public:
simpleSelectSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~simpleSelectSort(){
delete b;
}
void sort(){
for(int i =0;i<size;i++)b[i] =a[i];
swapTime = 0;
compTime = 0;
start = time(&start);

for(int i=0;i<size;i++){
int minind =i;
for(int j=i+1;j<size&&++compTime;j++){
if(b[minind]>b[j]){
minind = j;
}
}
if(i!=minind){
swap(b[minind],b[i]);
swapTime+=3;
}
}

stop= time(&stop);
}

void print(){
puts("6 简单选择排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

class heapSort{
public:
heapSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~heapSort(){
delete b;
}
void heapAdjust(int i,int size){
int lchild = 2*i;
int rchild = 2*i+1;
int mx = i;
if(i<=size/2){
if(lchild<size&&b[lchild]>b[mx]){
mx = lchild;
compTime++;
}
if(rchild<size&&b[rchild]>b[mx]){
mx = rchild;
compTime++;
}
}
if(mx!=i){
swapTime+=3;
swap(b[mx],b[i]);
heapAdjust(mx,size);
}
}
void sort(){
for(int i =0;i<size;i++)b[i] =a[i];
swapTime = 0;
compTime = 0;
start = time(&start);
for(int i = size/2;i>=0;i--){
heapAdjust(i,size);
}
for(int i = size;i>0;i--){
swap(b[0],b[i-1]);
heapAdjust(0,i-1);
}
stop= time(&stop);
}

void print(){
puts("7 堆排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

class mergeSort{
public:
mergeSort(int * a,int size){
this->a = a;
this->size = size;
b = new int[size];
}
~mergeSort(){
delete b;
}
void merge(int s,int t){
//printf("s %d t %d\n",s,t);
int mid = (s+t)>>1;
if(s+1<mid)merge(s,mid);
if(t>mid+1)merge(mid,t);
int* tmp = new int[t-s+1];
int i = s,j = mid,k = s;
while(k<t){
if(i<mid&&j<t){
compTime++;
if(b[i]<b[j])tmp[k++-s]=b[i++];
else  tmp[k++-s]=b[j++];
}
else if(i<mid){
tmp[k++-s]=b[i++];
}
else{
tmp[k++-s]=b[j++];
}
swapTime ++;
}
while(--k>=s){
b[k]=tmp[k-s];swapTime++;
}
//  print();
delete tmp;
}
void sort(){
for(int i =0;i<size;i++)b[i] =a[i];
swapTime = 0;
compTime = 0;
start = time(&start);

merge(0,size);

stop= time(&stop);
}

void print(){
puts("8 归并排序");
puts("展示结果");
for(int i =0;i<size;i++)printf("%d%c",b[i],i==size-1?'\n':' ');
printf("关键字比较次数:%d\n",compTime);
printf("关键字排序次数:%d\n",swapTime);
printf("用时:%ld ms\n",stop-start);
}
int swapTime;
int compTime;
private:
int * a;
int * b;
int size;
time_t start,stop;

};

int printInstruction(){
puts("*************************************************");
puts("0 退出");
puts("1 直接显示结果");
puts("2 比较八种不同排序");
puts("3 重新生成数据");
puts("*************************************************");
int op;
scanf("%d",&op);
return op;
}
class generator{
public:
generator(){
this->size = 200;
this->bon = 200;
a = new int[size];
for(int i= 0;i<size;i++){
a[i] = rand()*bon/RAND_MAX;
}
}
generator(int size,int bon){
this->size = size;
this->bon = bon;
a = new int[size];
for(int i= 0;i<size;i++){
a[i] = rand()*bon/RAND_MAX;
}
}
~generator(){
delete a;
}
void print(){
printf("容量:%d 生成数最大值:%d %p\n",size,bon,a);
for(int i =0;i<size;i++)printf("%d%c",a[i],i==size-1?'\n':' ');
}
int* a;
int size;
int bon;
};
void sortPrint(generator * g){
insertSort * sort1=new insertSort(g->a,g->size);
halfInsertSort * sort2 = new halfInsertSort(g->a,g->size);
shellSort * sort3 = new shellSort(g->a,g->size);
bubbleSort * sort4 = new bubbleSort(g->a,g->size);
quickSort * sort5 = new quickSort(g->a,g->size);
simpleSelectSort* sort6 = new simpleSelectSort(g->a,g->size);
heapSort * sort7 = new heapSort(g->a,g->size);
mergeSort * sort8 = new mergeSort(g->a,g->size);

ofstream out("data.txt");
sort1->sort();
sort1->print();
out<<"("<<sort1->compTime<<","<<sort1->swapTime<<") ";
sort2->sort();
sort2->print();
out<<"("<<sort2->compTime<<","<<sort2->swapTime<<") ";
sort3->sort();
sort3->print();
out<<"("<<sort3->compTime<<","<<sort3->swapTime<<") ";
sort4->sort();
sort4->print();
out<<"("<<sort4->compTime<<","<<sort4->swapTime<<") ";
sort5->sort();
sort5->print();
out<<"("<<sort5->compTime<<","<<sort5->swapTime<<") ";
sort6->sort();
sort6->print();
out<<"("<<sort6->compTime<<","<<sort6->swapTime<<") ";
sort7->sort();
sort7->print();
out<<"("<<sort7->compTime<<","<<sort7->swapTime<<") ";
sort8->sort();
sort8->print();
out<<"("<<sort8->compTime<<","<<sort8->swapTime<<") ";
out<<endl;

delete sort1;
delete sort2;
delete sort3;
delete sort4;
delete sort5;
delete sort6;
delete sort7;
delete sort8;
}
int main(){
generator* g = new generator();

int op;
while((op=printInstruction())!=0){
switch(op){
case 1:
g->print();
break;
case 2:
sortPrint(g);
break;
case 3:
delete g;
int sz,bon;
puts("请输入样本容量");
scanf("%d",&sz);
puts("请输入随机生成数最大值");
scanf("%d",&bon);
g = new generator(sz,bon);
g->print();
break;
default:
break;
}
}
delete g;
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: