zoukankan      html  css  js  c++  java
  • 数据结构—排序及时间复杂度

    实验八 排序

    一、 实验目的:
    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 , "
    ") ;
    	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
    " ,tot_time ) ;
    	fclose(fp) ;fclose(fstream) ;
    	return 0;
    } 
    

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

  • 相关阅读:
    Hufman编码实现运用1 (原理不描述)
    E
    1178: [Apio2009]CONVENTION会议中心
    1071: [SCOI2007]组队
    #333. 【NOIP2017】宝藏
    CF 96 D. Volleyball
    CF 987 D. Fair
    qbxt的题:运
    qbxt的题:找一个三元环
    4361: isn
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11745919.html
Copyright © 2011-2022 走看看