1.归并排序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 50000
void merge(int [],int,int,int);//归并排序数组合并函数声明
void mergesort(int [],int,int);//归并排序数组排序函数声明
//主函数
int main()
{
int i,a1[N];
double t1,t2,t3,t4;
for(i=0;i<N;i++)
{
a1[i]=rand()%N;
}
//归并排序N个随机数字所用的时间
t2=clock();
mergesort(a1,0,N-1);
t2=clock()-t2;
/*排好序的结果*/
for(i=0;i<N-1;i++)
{
printf("%4d\n",a1[i]);
}
printf("\n归并排序%d个随机数字所用时间为:%f毫秒\n",N,(double)t2);
getch();
return 1;
}
//归并排序
//归并排序合并数组函数的具体实现
void merge(int a[],int low,int middle,int high)
{
int h,i,j,k;
int b[N];
h=low;
i=low;
j=middle+1;
while(h<=middle&&j<=high)
{
if(a[h]<=a[j])
{
b[i]=a[h];
h++;
}
else
{
b[i]=a[j];
j++;
}
i++;
}
if(h>middle)
for(k=j;k<=high;k++)
{
b[i]=a[k];
i++;
}
else
{
for(k=h;k<=middle;k++)
{
b[i]=a[k];
i++;
}
}
for(k=low;k<=high;k++)
{
a[k]=b[k];
}
}
//归并排序函数的具体实现
void mergesort(int a[],int low,int high)
{
int middle;
if(low<high)
{
middle=(low+high)/2;
mergesort(a,low,middle);
mergesort(a,middle+1,high);
merge(a,low,middle,high);
}
}
2.快速排序
#include"stdio.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 50000
void quickSort(int a[],int left,int right)
{
int i,j,temp;
i=left;
j=right;
temp=a[left];
if(left>right)
return;
while(i!=j)/*找到最终位置*/
{
while(a[j]>=temp && j>i)
j--;
if(j>i)
a[i++]=a[j];
while(a[i]<=temp && j>i)
i++;
if(j>i)
a[j--]=a[i];
}
a[i]=temp;
quickSort(a,left,i-1);/*递归左边*/
quickSort(a,i+1,right);/*递归右边*/
}
int main()
{
double t2=clock();
int i,a[N];
for(i=0;i<N;i++)
{
a[i]=rand()%N;
}
quickSort(a,0,N-1);
t2=clock()-t2;
/*排好序的结果*/
for(i=0;i<N-1;i++)
{
printf("%4d\n",a[i]);
}
printf("\n快速排序%d个随机数字所用时间为:%f毫秒\n",N,(double)t2);
getch();
return 1;
}
3.堆排序
#include <stdio.h>
#include <time.h>
#include <math.h>
#define LEFT(i) ((i)<<1)
#define RIGHT(i) (((i)<<1) + 1)
#define N 50000
void max_heapify(int a[], int i, int heapsize);
void heap_sort(int a[], int heapsize);
void build_max_heap(int a[], int heapsize);
void exchange(int *x, int *y);
//交换两个数的值
void exchange(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}
//保持最大堆性质
void max_heapify(int a[], int i, int heapsize) {
int left, right, largerest;
left = LEFT(i);
right = RIGHT(i);
if (left <= heapsize && a[left]>a[i])
{
largerest = left;
}else{
largerest = i;
}
if (right <= heapsize && a[right]>a[largerest])
{
largerest = right;
}
if(largerest != i) {
exchange(&a[i], &a[largerest]);
max_heapify(a, largerest, heapsize);
}
}
//建造最大堆
void build_max_heap(int a[], int heapsize) {
int i;
for (i=(int)ceil(heapsize/2); i >=1 ; i--)
{
max_heapify(a, i, heapsize);
}
}
//堆排序
void heap_sort(int a[], int heapsize) {
//build heap
build_max_heap(a, heapsize);
while(heapsize>1)
{
//exchange max
exchange(&a[1], &a[heapsize]);
heapsize--;
max_heapify(a, 1, heapsize);
}
}
int main() {
double t2=clock();
int i,a[N];
for(i=0;i<N;i++)
{
a[i]=rand()%N;
}
heap_sort(a, N-1);
t2=clock()-t2;
//打印排序后的数组
for (i=1; i<N ; i++)
{
printf("%d\n",a[i]);
}
printf("\n堆排序%d个随机数字所用时间为:%f毫秒\n",N,(double)t2);
getch();
return 1;
}
4.冒泡排序
#include <stdio.h>
#include <time.h>
#include <math.h>
#define N 50000
int main()
{
double t2=clock();
int i,j,a[N];
int flag=1;
int temp;
for(i=0;i<N;i++)
{
a[i]=rand()%N;
}
for(i=0;i<N;i++)
{
for(j=0;j<N-i;j++)
{
if(a[j+1]<a[j])
{
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
flag=0;
}
}
if(flag==1)
{
break;
}
}
t2=clock()-t2;
//打印排序后的数组
for (i=0; i<N ; i++)
{
printf("%d\n",a[i]);
}
printf("\n冒泡排序%d个随机数字所用时间为:%f毫秒\n",N,(double)t2);
getch();
return 1;
}
时间性能最好的是快速排序,最差的是冒泡排序。。。。。。
原文地址:http://my.oschina.net/wangwang110/blog/11127
分享到:
相关推荐
C语言实现的九种经典排序算法(直接选择排序、冒泡排序、快速排序、归并排序、直接插入排序、希尔排序、折半插入排序、堆排序、基数排序),运行稳定高效。
书籍管理:完成增加新书籍和删除功能,并在完成操作之后按关键字(编号、书名、作者、种类)进行排序(插入、冒泡、快速、堆排序、归并排序等任选一种);现有如下书籍需要管理 二分法查找 冒泡排序 C语言描述
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...
C语言程序源代码(大集合).rar 实际只有139个,其余部分丢失! 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007 自增/自...
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...
希尔排序,基数排序,直接选择排序,快速排序,归并排序,直接插入排序,堆排序,冒泡法排序 八种排序算法的源代码,C语言实现
源代码使用方法是(以实例1为例): 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到), 拷贝到tc编译器目录下,运行tc.exe,打开编译器, 按【F3】键或者“File->Open”菜单命令,打开1.c文件, 按...
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...
│ ├─选择排序(堆排序) │ │ 1.txt │ │ 2.txt │ │ 3.txt │ │ main.cpp │ │ RedType.cpp │ │ RedType.h │ │ Sq_HeapSort.cpp │ │ Sq_HeapSort.h │ │ │ ├─选择排序(树形选择排序) │ │ 1.txt ...
源代码使用方法是(以实例1为例): 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到), 拷贝到tc编译器目录下,运行tc.exe,打开编译器, 按【F3】键或者“File->Open”菜单命令,打开1.c文件, 按...
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...
源代码使用方法是(以实例1为例): 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到), 拷贝到tc编译器目录下,运行tc.exe,打开编译器, 按【F3】键或者“File->Open”菜单命令,打开1.c文件, 按...
045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置 057 运动会...
1.9 C源程序的结构特点 1.10 书写程序时应遵循的规则 1.11 C语言的字符集 1.12 C语言词汇 1.13 Turbo C 2.0 集成开发环境的使用 1.13.1 Turbo C 2.0 简介和启动 1.13.2 Turbo C 2.0 集成开发环境 1.13.3 File菜单...
第二部分 数据结构篇 042 插入排序 043 希尔排序 044 冒泡排序 045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式...
1.9 C源程序的结构特点 1.10 书写程序时应遵循的规则 1.11 C语言的字符集 1.12 C语言词汇 1.13 Turbo C 2.0 集成开发环境的使用 1.13.1 Turbo C 2.0 简介和启动 1.13.2 Turbo C 2.0 集成开发环境 1.13.3 File菜单...