几种排序的比较

#include <iostream>
#include <time.h>
#include <locationapi.h>
using namespace std;
const int N = 1e6;
time_t Now() {
    time_t second;
    time(&second);
    SYSTEMTIME ms;
    GetSystemTime(&ms);
    return second * 1000 + ms.wMilliseconds;
}
void init(int a[], int n) {
    srand(time(NULL));
    for (int i = 0; i < n; i++) {
        a[i] = rand();
    }
}
void check(int a[], int n) {
    for (int i = 1; i < n; i++) {
        if (a[i] < a[i - 1]) {
            printf("error");
            return;
        }
    }
    printf("finish");
}
// 把a[parent]为根的堆调整为大顶堆
void heapAdjust(int a[], int parent, int n) { // 2*i+1  2*i+2
    int top = a[parent];
    while (parent * 2 + 1 < n) {
        int child = parent * 2 + 1;
        if (child + 1 < n && a[child + 1] > a[child]) {
            child++;
        }
        if (top >= a[child]) {
            break;
        }
        a[parent] = a[child];
        parent = child;
    }
    a[parent] = top;
}
void heapSort(int a[], int n) {
    int i;
    for (i = n / 2 - 1; i >= 0; i--) {
        heapAdjust(a, i, n);
    }
    for (i = n - 1; i > 0; i--) {
        int t = a[i];
        a[i] = a[0];
        a[0] = t;
        heapAdjust(a, 0, i);
    }
}
void InsertSort(int a[], int n) { // 简单插入排序
    int i, j;
    for (i = 1; i < n; i++) {
        int t = a[i]; // 取未排序的第一个元素
        for (j = i; j >= 1 && a[j - 1] > t; j -= 1) { // 依次与已排序的元素比较
            a[j] = a[j - 1]; // 右移,为该元素空出插入的位置
        }
        a[j] = t; // 插入该元素
    }
}
void bSort(int a[], int n) { // 冒泡
    int i, j, t;
    for (i = 0; i < n - 1; i++) {
        int sorted = 1;
        for (j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                sorted = 0;
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
        if (sorted) {
            break;
        }
    }
}
void ShellSort(int a[], int n) { // 希尔排序
    int gap = n >> 1; // 增量
    while (gap > 0) {
        int i, j;
        // 对每一个子序列进行插入排序
        for (i = gap; i < n; i++) {
            int t = a[i]; // 取当前子序列中未排序的第一个元素
            for (j = i; j >= gap && a[j - gap] > t; j -= gap) { // 依次与当前子序列中已排序的元素比较
                a[j] = a[j - gap]; // 右移,为该元素空出插入的位置
            }
            a[j] = t; // 插入该元素
        }
        gap >>= 1;
    }
}
void changeFirst(int a[], int left, int right) {
    int i = left + rand() % (right - left);
    int t = a[left];
    a[left] = a[i];
    a[i] = t;
}
int getP(int a[], int left, int right) { // 快排
    changeFirst(a, left, right);
    int k = a[left], i, index = left;
    for (i = left + 1; i <= right; i++) {
        if (a[i] < k) {
            index++;
            int t = a[i];
            a[i] = a[index];
            a[index] = t;
        }
    }
    a[left] = a[index];
    a[index] = k;
    return index;
}
void quickSort(int a[], int left, int right) {
    if (left < right) {
        int mid = getP(a, left, right);
        quickSort(a, left, mid - 1);
        quickSort(a, mid + 1, right);
    }
}
int a[N] = {0};
int main() {
    init(a, N);
    time_t start = Now();
    // quickSort(a, 0, N - 1);
    // ShellSort(a, N);
    heapSort(a, N);
    printf("\nuse: %lld ms\n", Now() - start);
    check(a, N);
    return 0;
}

当N=1e6,数组元素随机时,

  • 堆排序约200ms
  • 希尔排序约270ms
  • 快速排序约170ms
  • 插入排序。。。

当N=1e6,数组元素有序或基本有序时,

  • 堆排序约120ms
  • 希尔排序约50ms
  • 快速排序约140ms
  • 插入排序约3ms

当N=1e6,数组元素全部相同时,

  • 堆排序约10ms
  • 希尔排序约50ms
  • 快速排序。。。
  • 插入排序约3ms
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值