1. 程式人生 > >快速排序的遞迴和非遞迴演算法測試

快速排序的遞迴和非遞迴演算法測試

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stack>
#define N 40
using namespace std;
typedef struct{
	int key;
}Elemtype;
typedef struct{
	Elemtype *elem;
	int length;
}Table;
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
void Save(int n){
	//存入檔案中 
	int i,j,t,f,a[N];
	FILE *fp;
	srand(time(0));
	fp=fopen("zhengshu.txt","w");
	for(i=1;i<=n;i++){
		f=1;
		t=rand()%90+10;
		for(j=1;j<=i;j++){
			if(t==a[j])
				f=0;
		}
		if(f){
			a[i]=t; 
		}
	}
	for(i=1;i<=n;i++){
		fprintf(fp,"%d ",a[i]);
	}
	fclose(fp);
}
void Get(Table &T,int n){
	//順序表儲存 
	FILE *fp;
	int i;
	fp=fopen("zhengshu.txt","r");
	T.elem=(Elemtype *)malloc(n*sizeof(Elemtype));
	for(i=1;i<=n;i++)
		fscanf(fp,"%d ",&T.elem[i].key);
	fclose(fp);
	T.length=n;
}
void Output1(Table T){
	int i;
	for(i=1;i<=T.length;i++){
		printf("%d ",T.elem[i].key);
	}
	printf("\n");
}
void InitList(LinkList &L,int n){
	//連結串列儲存 
	FILE *fp;
	LinkList p,pre;
	int x,i;
	fp=fopen("zhengshu.txt","r");
	L=pre=(LinkList)malloc(sizeof(LNode));
	for(i=1;i<=n;i++){
		fscanf(fp,"%d ",&x);
		p=(LinkList)malloc(sizeof(LNode));
		p->data=x;
		pre->next=p;
		pre=p;
	}
	pre->next=NULL;
}
void Output2(LinkList L){
	LinkList p;
        p=L->next;
        while(p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
}
/*快速排序遞迴演算法*/
int Partition(Table &T,int low,int high){
	int pivotkey;
	T.elem[0]=T.elem[low];
	pivotkey=T.elem[low].key;
	while(low<high){
		while(low<high&&T.elem[high].key>=pivotkey)  --high;
		T.elem[low]=T.elem[high];
		while(low<high&&T.elem[low].key<=pivotkey)   ++low;
		T.elem[high]=T.elem[low];
	}
	T.elem[low]=T.elem[0];
	return low;
}
void QuickSort1(Table &T,int low,int high){
	int pivotloc;
	if(low<high){
		pivotloc=Partition(T,low,high);
		QuickSort1(T,low,pivotloc-1);
		QuickSort1(T,pivotloc+1,high);
	}
}
/*************************************/
/*快速排序非遞迴演算法*/
void QuickSort2(Table &T,int low,int high){
	stack<int> st;
	if(low<high){
		int mid=Partition(T,low,high);
		if(low<mid-1){
			st.push(low);
			st.push(mid-1);
		}
		if(mid+1<high){
			st.push(mid+1);
			st.push(high);
		}
		while(!st.empty()){
			int q=st.top();
			st.pop();
			int p=st.top();
			st.pop();
			mid=Partition(T,p,q);
			if(p<mid-1){
				st.push(p);
				st.push(mid-1);
			}
			if(mid+1<q){
				st.push(mid+1);
				st.push(q);
			}
		}
	}
	
} 
/*************************************/
int main(){
	int n;
	Table T;
	LinkList L;
	printf("輸入個數:");
	scanf("%d",&n);
	Save(n);
	printf("順序表儲存:\n");
	Get(T,n);
	Output1(T);
	printf("遞迴:\n");
	QuickSort1(T,1,T.length);
	Output1(T);
	printf("非遞迴:\n");
	Get(T,n);
	QuickSort2(T,1,T.length);
	Output1(T);
	printf("連結串列儲存:\n");
	InitList(L,n);
	Output2(L);
	return 0;
} #include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stack>
#define N 40
using namespace std;
typedef struct{
	int key;
}Elemtype;
typedef struct{
	Elemtype *elem;
	int length;
}Table;
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
void Save(int n){
	//存入檔案中 
	int i,j,t,f,a[N];
	FILE *fp;
	srand(time(0));
	fp=fopen("zhengshu.txt","w");
	for(i=1;i<=n;i++){
		f=1;
		t=rand()%90+10;
		for(j=1;j<=i;j++){
			if(t==a[j])
				f=0;
		}
		if(f){
			a[i]=t; 
		}
	}
	for(i=1;i<=n;i++){
		fprintf(fp,"%d ",a[i]);
	}
	fclose(fp);
}
void Get(Table &T,int n){
	//順序表儲存 
	FILE *fp;
	int i;
	fp=fopen("zhengshu.txt","r");
	T.elem=(Elemtype *)malloc(n*sizeof(Elemtype));
	for(i=1;i<=n;i++)
		fscanf(fp,"%d ",&T.elem[i].key);
	fclose(fp);
	T.length=n;
}
void Output1(Table T){
	int i;
	for(i=1;i<=T.length;i++){
		printf("%d ",T.elem[i].key);
	}
	printf("\n");
}
void InitList(LinkList &L,int n){
	//連結串列儲存 
	FILE *fp;
	LinkList p,pre;
	int x,i;
	fp=fopen("zhengshu.txt","r");
	L=pre=(LinkList)malloc(sizeof(LNode));
	for(i=1;i<=n;i++){
		fscanf(fp,"%d ",&x);
		p=(LinkList)malloc(sizeof(LNode));
		p->data=x;
		pre->next=p;
		pre=p;
	}
	pre->next=NULL;
}
void Output2(LinkList L){
	LinkList p;
        p=L->next;
        while(p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
}
/*快速排序遞迴演算法*/
int Partition(Table &T,int low,int high){
	int pivotkey;
	T.elem[0]=T.elem[low];
	pivotkey=T.elem[low].key;
	while(low<high){
		while(low<high&&T.elem[high].key>=pivotkey)  --high;
		T.elem[low]=T.elem[high];
		while(low<high&&T.elem[low].key<=pivotkey)   ++low;
		T.elem[high]=T.elem[low];
	}
	T.elem[low]=T.elem[0];
	return low;
}
void QuickSort1(Table &T,int low,int high){
	int pivotloc;
	if(low<high){
		pivotloc=Partition(T,low,high);
		QuickSort1(T,low,pivotloc-1);
		QuickSort1(T,pivotloc+1,high);
	}
}
/*************************************/
/*快速排序非遞迴演算法*/
void QuickSort2(Table &T,int low,int high){
	stack<int> st;
	if(low<high){
		int mid=Partition(T,low,high);
		if(low<mid-1){
			st.push(low);
			st.push(mid-1);
		}
		if(mid+1<high){
			st.push(mid+1);
			st.push(high);
		}
		while(!st.empty()){
			int q=st.top();
			st.pop();
			int p=st.top();
			st.pop();
			mid=Partition(T,p,q);
			if(p<mid-1){
				st.push(p);
				st.push(mid-1);
			}
			if(mid+1<q){
				st.push(mid+1);
				st.push(q);
			}
		}
	}
	
} 
/*************************************/
int main(){
	int n;
	Table T;
	LinkList L;
	printf("輸入個數:");
	scanf("%d",&n);
	Save(n);
	printf("順序表儲存:\n");
	Get(T,n);
	Output1(T);
	printf("遞迴:\n");
	QuickSort1(T,1,T.length);
	Output1(T);
	printf("非遞迴:\n");
	Get(T,n);
	QuickSort2(T,1,T.length);
	Output1(T);
	printf("連結串列儲存:\n");
	InitList(L,n);
	Output2(L);
	return 0;
}