2019數據結構課程設計(終於可以回家了)

課程設計的組成部分
隨機生成n個整型數據,比較冒泡排序、直接插入排序、希爾排序、快速排序、簡單選擇排序、堆排序和歸併排序的時間性能。
要求:
1.n=5000,20000,80000,100000;
2.繪製時間性能的比較圖;
3.撰寫課程設計報告;
提交課程設計報告的電子版。

1.冒泡排序

#include "stdio.h"
#include "time.h"
#define N 100000

void BubbleSort(int a[],int n)
{
	int i,j,t;
	for(i=0;i<n-1;i++)
		for(j=n-1;j>i;j--)
			if(a[j]<a[j-1])
			{
				t=a[j];
				a[j]=a[j-1];
				a[j-1]=t;
			}
}
main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//設置隨機生成函數的種子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之間的隨機數
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序後:\n");
	start=clock();
	BubbleSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("冒泡排序n=%d所需時間%.2f毫秒\n",N,(double)end-start);
	

}

2.插入排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 10

void InSertSort(int a[],int n)
{
	int i,j,t; 
	for(i=1;i<n;i++)
	{
		if(a[i]<a[i-1])
		{
			t=a[i];
			j=i-1;
			do
			{
				a[j+1]=a[j];
				j--;
			}while(j>=0&&a[j]>t);
			a[j+1]=t;
		}
	}
}



main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//設置隨機生成函數的種子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之間的隨機數
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序後:\n");
	start=clock();
	InSertSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("插入排序n=%d所需時間%.2f毫秒\n",N,(double)end-start);
	

}


3.堆排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 10

void sift(int a[],int low,int high)
{
	int i=low,j=2*i;
	int tmp=a[i];
	while(j<=high)
	{
		if(j<high&&a[j]<a[j+1])
		j++;
		if(tmp<a[j])
		{
			a[i]=a[j];
			i=j;
			j=2*i;
		}
		else break;
	}
	a[i]=tmp;
}


void swap(int *pa,int *pb)
{
	int tmp;
	tmp=*pa,*pa=*pb,*pb=tmp;
}

void HeapSort(int a[],int n)
{
	int i;
	for(i=n/2;i>=0;i--)
		sift(a,i,n);
		for(i=n;i>=1;i--)
		{
			swap(&a[0],&a[i]);
			sift(a,0,i-1);
		}
}


main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//設置隨機生成函數的種子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之間的隨機數
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序後:\n");
	start=clock();
	HeapSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("堆排序n=%d所需時間%.2f毫秒\n",N,(double)end-start);
	

}

4.歸併排序

#include<stdio.h>
#include<time.h>
#define N 100000
#define max 1000
void merge(int a[],int p,int x,int q,int b[]){
    int i = p, r = x + 1, k=p;
    while(i<=x || r <= q){
    
        if((r > q)||(i <= x &&a[i] <= a[r])){
            b[k++] = a[i++];
        }else{
            b[k++] = a[r++];
        }
    }
    int j;
    //將B數組重新放入A數組
    for(j = p;j <=q;j++)
        a[j] = b[j];
}
void mergeSort(int a[],int p,int q,int b[]){
        if(p<q){
        //將數組平均分爲兩段
        int x=(q + p)/2;
        //遞歸
        mergeSort(a,p,x,b);
        mergeSort(a,x+1,q,b);
        merge(a,p,x,q,b);
        }
}
int main(){
    srand((unsigned int)time(NULL));
    int i;
    int start,end;
    int a[N],b[N];
    printf("隨機產生的N個隨機數爲:\n");
    for(i = 0; i< N; i++){
        a[i] = rand()%max+1;
        printf("%d ",a[i]);
    }
    start=clock();
    mergeSort(a,0,N,b);
    end=clock();
    for(i = 0; i< N; i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    printf("歸併排序n=%d所需時間%.2f毫秒\n",N,(double)end-start);
    return 0;
}


5.簡單選擇排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 100000


void swap(int *pa,int *pb)
{
	int tmp;
	tmp=*pa,*pa=*pb,*pb=tmp;
}

void SelectSort(int a[],int n)
{
	int i,j,k;
	for(i=0;i<n-1;i++)
	{
	k=i;
		for(j=i+1;j<n;j++)
			if(a[j]<a[k])
			{
				k=j;
			}
			if(k!=i)
			{
			   swap(&a[i],&a[k]);
			   
		}
	}
			   
}
main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//設置隨機生成函數的種子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之間的隨機數
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序後:\n");
	start=clock();
	SelectSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("簡單選擇排序n=%d所需時間%.2f毫秒\n",N,(double)end-start);
	

}

6.快速排序

#include<stdio.h>
#include<time.h>          //產生隨機數時時鐘做種子
#include<stdlib.h>
#define MaxSize 50
#define N 100000

typedef struct
{
    int key;      //記錄關鍵字
}RecordType;


int QKPass(RecordType r[], int left, int right) //一趟快速排序算法
{
    int low = left;
    int high = right;
    r[0] = r[left];
    while (low < high)
    {
        while (low<high && r[high].key>r[0].key)
        {
            high--;
        }
        if (low < high)
        {
            r[low] = r[high];
            low++;
        }
        while (low < high && r[low].key < r[0].key)
        {
            low++;
        }
        if (low < high)
        {
            r[high] = r[low];
            high--;
        }
    }
    r[low] = r[0];
    return low;               //返回基準記錄的位置
}
void QKSort(RecordType r[], int low, int high)      //快速排序
{
    if (low < high)
    {
        int pos = QKPass(r, low, high);         //調用一趟快速排序,以樞軸元素爲界劃分兩個子區間
        QKSort(r, low, pos - 1);             //對左部子表進行快速排序
        QKSort(r, pos + 1, high);             //對右部子表進行快速排序
    }
}



void ShowResult(RecordType* r, int length)        //輸出結果
{

    for (int i = 1; i <= length; i++)
    {
        printf("%d\t", r[i]);

        if (i % 10 == 0)
        {
            printf("\n");
        }
    }
}

void RandNum(RecordType r[MaxSize])
{
    srand((unsigned)time(NULL)); //初始化隨機數
    for (int i = 1; i <= N; i++)      
    {
        r[i].key = rand() % 1000 + 1;       //產生1-100之間的隨機數
        printf("%d\t", r[i]);
        if (i % 10 == 0)                    //每行輸出10個數
        {
            printf("\n");
        }

    }
}


int main()
{
    int n, m,start,end;
    RecordType r[31] ;
    
    printf("產生的隨機待排序列爲:\n");
            RandNum(r);
            start=clock();
            QKSort(r, 1, 100);
            printf("排序結果爲:\n");
            ShowResult(r, 100);
}

7.希爾排序

#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 100000

void ShellSort(int a[],int n)
{
	int i,j,d;
	int t;
	d=n/2;
	while(d>0)
	{
		for(i=d;i<n;i++)
		{
		t=a[i];
		j=i-d;
		while(j>=0&&t<a[j])	
		{
			a[j+d]=a[j];
			j=j-d;
		}
		a[j+d]=t;
		}
		d=d/2;
	}
 } 


main()

{
	int data[N],a[N],b[N],i;
	clock_t start,end;
	srand((unsigned)time(0));//設置隨機生成函數的種子
	printf("排序前:\n");
	for(i=0;i<N;i++)
	{
		data[i]=rand()%(N*10)+1;//生成1-100之間的隨機數
		a[i]=data[i];
		printf("%d ",a[i]);
	}
	printf("\n排序後:\n");
	start=clock();
	ShellSort(a,N);
	end=clock();
	for(i=0;i<N;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("希爾排序n=%d所需時間%.2f毫秒\n",N,(double)end-start);
	

}


排序性能比較如圖

在這裏插入圖片描述

如圖,相比較之下,快速排序相對其他算法,所用的時間短。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章