数据结构—排序及时间复杂度

实验八 排序

一、 实验目的:
1. 掌握各种排序的基本思想。 .
2. 掌握各种排序方法的算法实现。
3. 掌握各种排序方法的优劣及花费时间的计算。
4. 掌握各种排序方法所适应的不同场合。
二、 实验内容:
1. 随机函数产生 10000 个随机数, 用直接插入、 二分插入、 希尔等三种排序方法排序,
并统计每一种排序所花费的时间。
三、 实验要求:

  1. 根据实验内容编程, 上机调试、 得出正确的运行程序。
  2. 写出实验报告(包括源程序和运行结果) -电子档周日晚上十点前交给课代表。

样例生成器:

#include <bits/stdc++.h>
#include <time.h>

using namespace std;

int Random(int start, int end){
    int dis = end - start;
    return rand() % dis + start;
}

int main() {
	FILE *fp ;
	fp = fopen("SourceFile.txt" ,"a" );
	int lenght = 10000;
	for (int j = 1 ; j <= lenght ; j ++ ) {
		fprintf(fp , "%d " , Random(0 ,10000 )) ;
	} fprintf(fp , "\n") ;
	fclose(fp) ;
	return 0;
}

三种排序用函数封装好了

#include <bits/stdc++.h>
#include <time.h>

using namespace std;

const int maxn = 1e5 + 50 ;

int s[maxn] ;

void Insertsort() {
	int i ,j ;
	for( i = 2 ; i <= 10000 ; ++ i ) // 直接插入排序 
		if( s[i] < s[i-1] )
		{   										
			s[0]=s[i];
    		s[i]=s[i-1];
        	for( j = i-2 ; s[0] < s[j] ; -- j )
				s[j+1] = s[j];
        	s[j+1] = s[0];
		}
} 

void BinInsertsort() {
	int i ,j ,low ,high ,mid ;
	for ( i = 2 ; i <= 10000 ; i ++ ) { // 折半插入排序 
		s[0] = s[i];
		low = 1 ,high = i - 1;
		while ( low <= high ) {
			mid = (low + high) >> 1;
			if ( s[0] < s[mid] ) high = mid - 1;
			else low = mid + 1; 
		}
		for ( j = i - 1 ; j >= high + 1 ; j -- ) s[j + 1] = s[j] ;
		s[high + 1] = s[0] ;
	} 
}

void ShellInsert(int dk ) {
	int i ,j ;
	for (i = dk + 1 ; i <= 10000 ; i ++ ) {
		if ( s[i] < s[i-dk] ) {
			s[0] = s[i] ;
			for (j = i - dk ; j > 0 && s[0] < s[j] ; j-= dk)
				s[j+dk] = s[j] ;
			s[j+dk] = s[0];
		}
	}
}

int main() {
	FILE *fp ,*fstream ;
	clock_t start ,finish ;
	fp = fopen("SourceFile.txt" ,"r" ) ;
	fstream = fopen("ResultFile.txt" ,"aw") ;
	for (int i = 1 ; i <= 10000 ; i ++ ) {
		fscanf(fp ,"%d" ,&s[i] ) ;
	}
	start = clock() ;
	//Insertsort() ;
	//BinInsertsort() ;
	ShellInsert(1) ;
	finish = clock() ;
	for (int i = 1 ; i <= 10000 ; i ++ ) {
		printf("%d ",s[i]);
	} puts("") ;
	double tot_time = double(finish -start) / CLOCKS_PER_SEC;
	fprintf(fstream ,"10000个元素shell排序的时间为:%.3f\n" ,tot_time ) ;
	fclose(fp) ;fclose(fstream) ;
	return 0;
} 

但是我的结果二分插入排序竟然比插入排序的复杂度大,一定是数据的问题

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值