实验八 排序
一、 实验目的:
1. 掌握各种排序的基本思想。 .
2. 掌握各种排序方法的算法实现。
3. 掌握各种排序方法的优劣及花费时间的计算。
4. 掌握各种排序方法所适应的不同场合。
二、 实验内容:
1. 随机函数产生 10000 个随机数, 用直接插入、 二分插入、 希尔等三种排序方法排序,
并统计每一种排序所花费的时间。
三、 实验要求:
- 根据实验内容编程, 上机调试、 得出正确的运行程序。
- 写出实验报告(包括源程序和运行结果) -电子档周日晚上十点前交给课代表。
样例生成器:
#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;
}
但是我的结果二分插入排序竟然比插入排序的复杂度大,一定是数据的问题