C语言实现:比较快排,堆排,计数三种不同算法排序1亿数的时间

#include<stdio.h>
#include<stdlib.h>
#include <time.h>

#define N 100000000//一亿个数的排序
#define M 100000

#define SWAP(a,b) {int temp;temp= a; a=b;b=temp;}

void arrPrint(int *arr)
{
int i;
for (i = 0; i < N; i++)
{
printf("%6d", arr[i]);
}
printf("\n");
}
//
int partition(int *arr,int left,int right) {
int i, j;
for (i = left, j = left; i < right; i++) {
if (arr[i] < arr[right]) {
SWAP(arr[i], arr[j]);
j++;
}
}
SWAP(arr[right], arr[j]);
return j;
}
void arrQuickSort(int *arr, int left, int right) {
int pivot;//英 [pivet] 中点
if (left < right) {
pivot = partition(arr, left, right);
arrQuickSort(arr, left, pivot - 1);
arrQuickSort(arr, pivot + 1, right);
}
}
//heapsort
int changeToMaxHeap(int arr[],int adjustPOS,int arrLen) {
int dad = adjustPOS;
int son = 2 * dad + 1;
while (son < arrLen) {
if (son + 1 < arrLen&&arr[son] < arr[son + 1]) {//son+1<arrLen
son++;
}
if (arr[son]>arr[dad]) {
SWAP(arr[son], arr[dad]);
dad = son;
son = 2 * dad + 1;
}
else {
break;
}
}
}
void arrHeapSort(int *arr) {
int i;
for (i = N / 2; i >= 0;i–) {//外层循环控制进入不同的dad节点
changeToMaxHeap(arr, i, N);//changeToMaxHeap()只负责调整单个大根堆,可以放到一个函数里面,封装好
}
SWAP(arr[0],arr[N-1]);
for (i = N-1; i > 1; i++)
{
changeToMaxHeap(arr,0, i);
SWAP(arr[0], arr[i-1]);
}
}
//count sort
int arrCountSort(int *arr) {
int count[M];
for (int i = 0; i < N; i++)
{
count[arr[i]]++;
}
int i, j, k=0;
for (i = 0; i < M; i++) {//i是数据范围,控制数的范围大小
for (j = 0; j < arr[i]; j++) {
arr[k++] = i;
}
}
}
int main() {
int i;
//int arr[N];
int *arr = (int *)malloc(N * sizeof(int));

time_t startQuick, endQuick;
time_t startHeap, endHeap;
time_t startCount, endCount;

srand(time(NULL));
for (i = 0; i < N; i++) {
	arr[i] = rand()%M;
}
//arrPrint(arr);

//startQuick = time(NULL);
//arrQuickSort(arr, 0, N - 1);
//endQuick = time(NULL);
//arrPrint(arr);
//printf("quick sort use time=%d s\n", endQuick - startQuick);

startHeap = time(NULL);
arrQuickSort(arr, 0, N - 1);
endHeap = time(NULL);
//arrPrint(arr);
printf("heap sort use time=%d s\n", startHeap - endHeap);

//startCount = time(NULL);
//arrCountSort(arr);
//endCount = time(NULL);
//arrPrint(arr);
//printf("count sort use time=%d s\n", startCount - endCount);
system("pause");

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值