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;
    } 
    

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

  • 相关阅读:
    Neko's loop HDU-6444(网络赛1007)
    Parameters
    SETLOCAL
    RD / RMDIR Command
    devenv 命令用法
    Cannot determine the location of the VS Common Tools folder.
    'DEVENV' is not recognized as an internal or external command,
    How to change Visual Studio default environment setting
    error signing assembly unknown error
    What is the Xcopy Command?:
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11745919.html
Copyright © 2011-2022 走看看