排序算法比较

排序算法比较利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间。提示:用顺序存储结构。//排序算法比较#i

大家好,又见面了,我是你们的朋友全栈君。

利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间。提示:用顺序存储结构。

// 排序算法比较
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
#define numcnt 40000  // 30000时,有的对比不出来 
int num4[numcnt];
// 插入排序: 
void insert_sort(int a [], int n){
	int i=0,ii=0,temp=0;  
    for(i=1;i<n;i++)  //循环遍历 
    {
        temp=a[i];    //将temp每一次赋值为number[i] 
        ii=i-1;  
        while(ii>=0&&temp<a[ii])   
        {
            a[ii+1]=a[ii];    //将大的元素往前放 
            ii--; 
        }
        a[ii+1]=temp;    
    }
	// 测试,查看排序是否正确 
	for(i = 1; i < n; i++){
		if(a[i] < a[i-1]){
			printf("插入排序有错误!");	
			break;
		}
	}              
}

// 起泡排序
void bub_sort(int a[], int n)     
{
    int i,j,temp;    
    for (j=0;j<n-1;j++)     
    {                           
        for (i=0;i<n-1-j;i++)
        {
            if(a[i]>a[i+1])     //从大到小排就把左边的">"改为"<"
            {
                temp=a[i];      //a[i]与a[i+1](即a[i]后面那个) 交换
                a[i]=a[i+1];    //基本的交换原理"c=a;a=b;b=c" 
                a[i+1]=temp;
            }
        }
    }  
	// 测试,查看排序是否正确 
	for(i = 1; i < n; i++){
		if(a[i] < a[i-1]){
			printf("起泡排序有错误!");	
			break;
		}
	}   
} 

// 选择排序
void select_sort(int a[],int n)
{
	int i, j, index_nmax, tmp;
    for(i=0; i<n; i++) // 总共要找len-1次最大值,每次找最大值的区间 [0,len-i]
    {
        index_nmax = 0;
        for(j=1; j<n-i; j++) // 因为假设了0下标就是最大值,所以循环可以从1开始
        {
            if(a[j] > a[index_nmax])
            {
                index_nmax = j;
            }
        }        
        if(index_nmax != n-i-1) // 避免无意义的位置交换
        {
            tmp = a[index_nmax];
            a[index_nmax] = a[n-i-1];
            a[n-i-1] = tmp;
        }
    }  
	// 测试,查看排序是否正确 
	for(i = 1; i < n; i++){
		if(a[i] < a[i-1]){
			printf("选择排序有错误!");	
			break;
		}
	}    
}

// 快速排序 
void quick_sort(int left, int right)
{
    int i, j, c, temp;
    if(left>right)
        return;
    
    i= left;
    j= right;
    temp = num4[i];    

    while(i != j)
    {
        while(num4[j]>=temp && i<j)
        {
            j--;
        }
        
        while(num4[i]<=temp && i<j)
        {
            i++;
        }

        if(i<j)
        {
            c = num4[i];
            num4[i] = num4[j];
            num4[j] = c;
        }
    }
    
    //left为起始值(参照值)此时的I为第一次排序结束的最后值,与参照值交换位置
    num4[left] = num4[i];
    num4[i] = temp;

    //继续递归直到排序完成
    quick_sort(left, i-1);
    quick_sort(i+1, right);
}

// 堆排序
void HeapAdjust(int a[],int s,int m)//一次筛选的过程
{
    int rc,j;
    rc=a[s];
    for(j=2*s;j<=m;j=j*2)//通过循环沿较大的孩子结点向下筛选
    {
        if(j<m&&a[j]<a[j+1]) j++;//j为较大的记录的下标
        if(rc>a[j]) break;
        a[s]=a[j];s=j;
    }
    a[s]=rc;//插入
}
void Heap_Sort(int a[],int n)
{
    int temp,i;
    for(i=n/2;i>=0;i--)//通过循环初始化顶堆
    {
        HeapAdjust(a,i,n);
    }
    for(i=n-1;i>=0;i--)
    {
        temp=a[1];
        a[1]=a[i];
        a[i]=temp;//将堆顶记录与未排序的最后一个记录交换
        HeapAdjust(a,1,i-1);//重新调整为顶堆
    }
}

// 归并排序 
void merge(int arr[], int low, int mid, int high){
    int i, k, left_low, left_high, right_low, right_high;
    int *tmp = (int *)malloc((high-low+1)*sizeof(int));
    //申请空间,使其大小为两个
     left_low = low;
     left_high = mid;
     right_low = mid + 1;
     right_high = high;

    for(k=0; left_low<=left_high && right_low<=right_high; k++){  // 比较两个指针所指向的元素
        if(arr[left_low]<=arr[right_low]){
            tmp[k] = arr[left_low++];
        }else{
            tmp[k] = arr[right_low++];
        }
    }

    if(left_low <= left_high){  //若第一个序列有剩余,直接复制出来粘到合并序列尾
    //memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int));
    for(i=left_low;i<=left_high;i++)
        tmp[k++] = arr[i];
    }

    if(right_low <= right_high){
    //若第二个序列有剩余,直接复制出来粘到合并序列尾
    //memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int));
        for(i=right_low; i<=right_high; i++)
            tmp[k++] = arr[i];
    }

    for(i=0; i<high-low+1; i++)
        arr[low+i] = tmp[i];
    free(tmp);
    return;
}

void merge_sort(int arr[], unsigned int first, unsigned int last){
    int mid = 0;
    if(first<last){
        mid = (first+last)/2; /* 注意防止溢出 */
        /*mid = first/2 + last/2;*/
        //mid = (first & last) + ((first ^ last) >> 1);
        merge_sort(arr, first, mid);
        merge_sort(arr, mid+1,last);
        merge(arr,first,mid,last);
    }
    return;
}

int main(){
	int num[numcnt];  // 随机数 
	int num1[numcnt]; // 各个排序需要的数组 
	int num2[numcnt];
	int num3[numcnt];
	
	int num5[numcnt];
	int num6[numcnt];
	int i, j;
	
	clock_t start;
	srand(time(0));  //设置时间种子
	// 生成随机数: 
	for(i=0; i < numcnt; i++){
		num[i] = rand() % 1000;    //用rand函数生成0-1000的随机数
		num1[i] = num[i]; 
		num2[i] = num[i];
		num3[i] = num[i];
		num4[i] = num[i];
		num5[i] = num[i];
		num6[i] = num[i];
	}
	// 插入排序 
	start = clock();
	insert_sort(num1, numcnt); 
	printf( "插入排序-用时: %f ms\n", (double)(clock() - start) );

	// 起泡排序
	start = clock();
	bub_sort(num2, numcnt);
	printf( "起泡排序-用时: %f ms\n", (double)(clock() - start) );
	
	// 选择排序
	start = clock();
	select_sort(num3, numcnt);
	printf( "选择排序-用时: %f ms\n", (double)(clock() - start) );
	
	// 快速排序
	start = clock();
	quick_sort( 0, numcnt-1);
	// 测试,查看排序是否正确 
	for(i = 1; i < numcnt; i++){
		if(num4[i] < num4[i-1]){
			printf("快速排序有错误!");	
			break;
		}
	}
	printf( "快速排序-用时: %f ms\n", (double)(clock() - start) );
	
	// 堆排序
	start = clock();
	Heap_Sort(num5, numcnt);
	printf( "堆排序-用时: %f ms\n", (double)(clock() - start) );
	
	// 归并排序
	start = clock();
	merge_sort(num6, 0, numcnt-1);
	printf( "归并排序-用时: %f ms\n", (double)(clock() - start) );
	
	return 0;
}

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154186.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vuedevtools使用_怎么下载vue_devtools

    vuedevtools使用_怎么下载vue_devtoolsCSDN首页首页博客程序员学院下载论坛问答代码直播电子书最牛小程序:想要的资源都能搜到?会员中心收藏动态消息15创作中心vue调试工具vue-devtools安装及使用(最新)清虚桂意2020-06-2310:27:29606已收藏4分类专栏:vue版权github克隆vue-devtools官方项目地址gitclone-bv5.1.1https://github.com/vuejs/vue-devtools.git1此处安装v5.1

  • websocket大文件发送(分片传送思想)

    websocket大文件发送(分片传送思想)目前的项目是在做一款带桌面共享的代码编辑器,其中需要一个发送大文件的功能,传统的node.js处理大文件就是用Buffer.slice(0.offset)的思路把文件分割开,然后通过tcp或udp分开发送。前端中处理二进制的有Blob,它也有slice的方法,也可以将文件拆分开。然后借助websocket发开发送,然后在客户端(注意不是服务端)将文件合并。有人说websocket可以直接发,但是他的大小受到限制,比如发200M的东西,就会出问题。而我的方案就不会存在问题.最主要的是在发送文件的同时也不会影响

  • mysql的慢查询日志_一条sql查询很慢怎么去优化

    mysql的慢查询日志_一条sql查询很慢怎么去优化MySQL慢查询日志总结慢查询日志概念   MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然…

    2022年10月14日
  • POJ3061 Subsequence(二进制前缀和法律+仿真足)

    POJ3061 Subsequence(二进制前缀和法律+仿真足)

  • 常见的IT自动化运维工具有哪些?推荐一款好用的?「建议收藏」

    自动化运维是IT运维工作的升华,其不单纯是一个维护过程,更是一个管理的提升过程,是IT运维的最高层次,也是未来的发展趋势。所以作为IT运维人员,一定要知道常见的IT自动化运维工具有哪些?哪款比较好用?常见的IT自动化运维工具有哪些?1、Puppet2、SaltStack3、Ansible4、PSSH5、阿里云OOS6、行云管家【重点推荐】一款好用的自动化运维工具-行云管家!1、自动化运维之预设脚本库脚本是实现自动化运维的基础,运维人员经常通过脚本来替代以往一些需要手工操作的业务,提升工作

  • 911完整记录_入院记录书写

    911完整记录_入院记录书写本文记录了打PSU的全过程,意在体会数据库打PSU补丁的整个过程。1.OPatch替换为最新版本2.数据库软件应用19121551补丁程序3.数据库应用补丁4.验证PSU补丁是否应用成功1.OPatch替换为最新版本[oracle@DBusr2]$iduid=500(oracle)gid=500(oinstall)组=500(oinstall),501(dba)环境=…

    2022年10月15日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号