排序 - 直接插入排序,二分插入排序,运行时间对比

typedef struct 可以 换成 struct,试了下也对

typedef struct {
    int key;
    char *otherinfo;
} Node;

//顺序表的存储结构
typedef struct {
    Node *r;   //存储空间的基地址
    int length;  //顺序表长度
} SqList;  //顺序表类型

--------换成---:

struct Node{
    int key;
    char *otherinfo;
};

//顺序表的存储结构
struct SqList{
    Node *r;   //存储空间的基地址
    int length;  //顺序表长度
};

 

 

#include <stdio.h>
#include <iostream>
#include <stdlib.h> // 随机函数rand()需要的头文件
#include <time.h>
using namespace std;
#define MAXSIZE 2000000 //顺序表的最大长度

typedef struct {
    int key;
    char *otherinfo;
} Node;

//顺序表的存储结构
typedef struct {
    Node *r;   //存储空间的基地址
    int length;  //顺序表长度
} SqList;  //顺序表类型

//直接插入排序
void InsertSort(SqList &L) {
    //对顺序表L做直接插入排序
    int i, j;
    for (i = 2; i <= L.length; i++) {
        if (L.r[i].key < L.r[i-1].key) {  //"<",需将r[i]插入有序子表
            L.r[0] = L.r[i];             //将待插入的记录暂存到监视哨中
            L.r[i] = L.r[i - 1];        //r[i-1]后移
            for (j = i - 2; L.r[0].key < L.r[j].key; j--) {  //从后向前寻找插入位置
                L.r[j + 1] = L.r[j];         //记录逐个后移,直到找到插入位置
            }
            L.r[j + 1] = L.r[0];     //将r[0]即原r[i],插入到正确位置
        }
    }
}

//二分插入排序
void BInsertSort(SqList &L) {
    int i, j, m, low, high;
    for (i = 2; i <= L.length; i++) {
        L.r[0] = L.r[i];
        low = 1;
        high = i - 1;
        while (low <= high) {
            m = (low + high) / 2;
            if (L.r[0].key < L.r[m].key) {
                high = m - 1;
            }
            else {
                low = m + 1;
            }
        }
        for (j = i - 1; j >= high + 1; j--) {
            L.r[j + 1] = L.r[j];
        }
        L.r[high + 1] = L.r[0];
    }
}

int main() {
    SqList L;
    L.r = new Node[MAXSIZE + 1];
    int n, i, j;
    printf("请输入元素个数:\n");
    cin >> n;
    L.length = n;
    clock_t start1, finish1;
    start1 = clock();
    {
        for (i = 1; i <= n; i++) {
            L.r[i].key = rand();
        }
        InsertSort(L);//直接插入排序
    }
    finish1 = clock();
    double time1 = (double)(finish1 - start1) / CLOCKS_PER_SEC;
    printf("直接插入排序运行时间为:%lf seconds \n", time1);


    clock_t start2, finish2;
    start2 = clock();
    {
        for (i = 1; i <= n; i++) {
            L.r[i].key = rand();
        }
        BInsertSort(L);//二分插入排序
    }
    finish2 = clock();
    double time2 = (double)(finish2 - start2) / CLOCKS_PER_SEC;
    printf("二分插入排序运行时间为:%lf seconds \n", time2);

    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值