希尔排序与冒泡排序比较

数据结构 专栏收录该内容
6 篇文章 0 订阅

1.希尔排序:

// 希尔排序
double shellsort(int a[], int len) {
    time_t start, end;
    double ret;
    start = clock();
	int d, i, j;  
	int tmp; 
    for (d = len / 2; d >= 1; d /= 2) {         // d为步长,每轮步长减半 
        for (i = d; i <= len; i++) {        // 在每个子表内进行直接插入排序 
            if (a[i] < a[i - d]) {      
                tmp = a[i];                
                for (j = i - d; j > 0 && tmp < a[j]; j -= d)
                    a[j + d] = a[j];        
                a[j + d] = tmp;       
            }
        }
    }
    end = clock();
    ret = double(end - start) / CLOCKS_PER_SEC;
    return ret;
}

2.冒泡排序:

// 冒泡排序
double bubblesort(int b[], int len) {
	time_t start, end;
    double ret;
    start = clock();
	for (int i=0; i<len-1; i++){  // 总共排序n次 
		for (int j=0; j<len-i-1; j++){  // 后i项已经排序完毕,因此每次可以少比较一次 
			if (b[j] > b[j+1]){  // 当前一个数比后一个数大时交换两个数的顺序 
				int tmp = b[j];
				b[j] = b[j+1];
				b[j+1] = tmp;
			}
		}
	}
	end = clock();
    ret = double(end - start) / CLOCKS_PER_SEC;
    return ret;
}

3.两种排序方法的比较:

#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;


// 生成范围在l~r的随机数
void random(int *a, int n, int l, int r){
	srand(time(0));  // 设置时间种子
	for(int i=0; i<n; i++){
		a[i]=rand()%(r-l+1)+l;  // 生成r~l的随机数 
	}
}


// 希尔排序
double shellsort(int a[], int len) {
    time_t start, end;
    double ret;
    start = clock();
	int d, i, j;  
	int tmp; 
    for (d = len / 2; d >= 1; d /= 2) {         // d为步长,每轮步长减半 
        for (i = d; i <= len; i++) {        // 在每个子表内进行直接插入排序 
            if (a[i] < a[i - d]) {      
                tmp = a[i];                
                for (j = i - d; j > 0 && tmp < a[j]; j -= d)
                    a[j + d] = a[j];        
                a[j + d] = tmp;       
            }
        }
    }
    end = clock();
    ret = double(end - start) / CLOCKS_PER_SEC;
    return ret;
}


// 冒泡排序
double bubblesort(int b[], int len) {
	time_t start, end;
    double ret;
    start = clock();
	for (int i=0; i<len-1; i++){  // 总共排序n次 
		for (int j=0; j<len-i-1; j++){  // 后i项已经排序完毕,因此每次可以少比较一次 
			if (b[j] > b[j+1]){  // 当前一个数比后一个数大时交换两个数的顺序 
				int tmp = b[j];
				b[j] = b[j+1];
				b[j+1] = tmp;
			}
		}
	}
	end = clock();
    ret = double(end - start) / CLOCKS_PER_SEC;
    return ret;
}


int main() {
    double t1 = 0, t2 = 0;
	int n = 100000;
    int a[n], b[n];
    random(a, n, 1, 10000000);
    random(b, n, 1, 10000000);
    t1 = bubblesort(a, n);
    t2 = shellsort(b, n);
    cout << "共排序" << n << "个数字" << endl; 
    cout << "冒泡排序时间为:" << t1  << "秒" << endl <<"希尔排序时间为:" << t2 << "秒" <<endl; 
//    for (int m=0; m<n; m++){
//    	cout << a[m] << " ";
//	}
    getchar();
    return 0;
}

在1~10000000内随机生成100000个数字,用这100000个数字分别进行冒泡排序和希尔排序,计算两次排序的时间:

1.第一次结果:

在这里插入图片描述

2.第二次结果:

在这里插入图片描述

3.第三次结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值