`
thecloud
  • 浏览: 880909 次
文章分类
社区版块
存档分类
最新评论

归并排序,快速排序,堆排序,冒泡排序 c语言源代码

 
阅读更多

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语言实现的九种经典排序算法(直接选择排序、冒泡排序、快速排序、归并排序、直接插入排序、希尔排序、折半插入排序、堆排序、基数排序),运行稳定高效。

    图书管理系统源代码 C语言

    书籍管理:完成增加新书籍和删除功能,并在完成操作之后按关键字(编号、书名、作者、种类)进行排序(插入、冒泡、快速、堆排序、归并排序等任选一种);现有如下书籍需要管理 二分法查找 冒泡排序 C语言描述

    C语言源代码实例.rar

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...

    C语言程序源代码(大集合).rar

    C语言程序源代码(大集合).rar 实际只有139个,其余部分丢失! 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007 自增/自...

    220个C语言程序源代码.zip

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...

    各种排序算法 源码

    希尔排序,基数排序,直接选择排序,快速排序,归并排序,直接插入排序,堆排序,冒泡法排序 八种排序算法的源代码,C语言实现

    220个C源代码 初学C语言必备

    源代码使用方法是(以实例1为例): 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到), 拷贝到tc编译器目录下,运行tc.exe,打开编译器, 按【F3】键或者“File-&gt;Open”菜单命令,打开1.c文件, 按...

    C语言经典源代码实例 数据结构 操作系统 图形等

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...

    220个C语言程序源代码集合.zip

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...

    C语言220例从易到难源代码

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...

    数据结构与算法全集(C源代码+详细注释)

    │ ├─选择排序(堆排序) │ │ 1.txt │ │ 2.txt │ │ 3.txt │ │ main.cpp │ │ RedType.cpp │ │ RedType.h │ │ Sq_HeapSort.cpp │ │ Sq_HeapSort.h │ │ │ ├─选择排序(树形选择排序) │ │ 1.txt ...

    C语言实例解析精粹(第二版) 光盘代码

    源代码使用方法是(以实例1为例): 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到), 拷贝到tc编译器目录下,运行tc.exe,打开编译器, 按【F3】键或者“File-&gt;Open”菜单命令,打开1.c文件, 按...

    关于C的精粹包含至少200个C语言小程序

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...

    C语言常用算法

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置...

    C语言精粹(第2版)随书关盘

    源代码使用方法是(以实例1为例): 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到), 拷贝到tc编译器目录下,运行tc.exe,打开编译器, 按【F3】键或者“File-&gt;Open”菜单命令,打开1.c文件, 按...

    C语言学习实例220例

    045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入和删除 054 链表操作(1) 055 链表操作(2) 056 单链表就地逆置 057 运动会...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    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菜单...

    C源代码实例集

    第二部分 数据结构篇 042 插入排序 043 希尔排序 044 冒泡排序 045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    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菜单...

Global site tag (gtag.js) - Google Analytics