Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 213|回复: 0

[默认分类] C语言进阶——基于数组的排序

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-3-16 13:15:13 | 显示全部楼层 |阅读模式

    普通选择排序
    1、实现原理和思想(升序):
    1)在未排序的数组中,选择首元素与其后元素进行比较,若其后元素比首元素大,则两元素交换,直至比较到最后一个元素,这是第一轮比较,得到首元素有序。
    2)接下来从第2个,第3个元素…重复1)的步骤,直至剩下最后一个元素,则最后一个元素也是有序,是本组元素的最大值。

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

    #define len 10
    typedef enum{
        EROOR,SUCCESS
    }STATUS;
    STATUS selectSort(int *arr,int n){

        for(int i = 0;i<len-1;i++){
            for(int j = i+1;j<len;j++){
                if(arr[i]>arr[j]){
                    arr[i]^= arr[j];
                    arr[j]^= arr[i];
                    arr[i]^= arr[j];
                }
            }
        }

        return SUCCESS;
    }
    int main(void){

        srand(time(NULL));
        int arr[len];
        for(int i = 0;i<len;i++){
            arr[i = rand()%100+1;
        }

        selectSort(arr,len);

        for(int i = 0;i<len;i++){
            printf("%5d",arr[i]);
        }
        return 0;
    }

    选择排序优化——比而不换
    此优化是借助记录每次比较较小值的位置,直到最后一个元素,然后比较较小值的位置和待交换元素位置是否相同,不同说明不是同一个元素则交换

    STATUS selectSort(int *arr,int n){
        int idx;
        for(int i = 0;i<len-1;i++){
            idx = i;
            for(int j = i+1;j<len;j++){
                if(arr[idx]>arr[j])
                    idx = j;
            }

            if(idx != i){
                arr[i]^= arr[idx];
                arr[idx]^= arr[i];
                arr[i]^= arr[idx];
            }
        }

        return SUCCESS;
    }

    普通冒泡排序
    1、冒泡排序的步骤和思想(升序),其实就是邻近的数据两两交换,第一轮下来最后一个元素就是本组元素的最大值,接下来的元素都是重复此步骤。

    //冒泡排序
    STATUS popSort(int *arr,int n){

        for(int i = 0;i<n-1;i++){
            for(int j = 0;j<n-i-1;j++){
                if(arr[j]>arr[j+1]){
                    arr[j ^= arr[j+1];
                    arr[j+1 ^= arr[j];
                    arr[j ^= arr[j+1];
                }
            }
        }
    }

    冒泡排序优化——减少不必要的比较循环
    思想:若一组数据,有序,那么只需进行一轮比较,判断这轮比较中有没有数据进行交换,若无说明数据有序,无序再进行比较,根据这个结论,设计得到这段优化代码

    //冒泡排序
    STATUS popSort(int *arr,int n){

        int flag = 0;
        for(int i = 0;i<n-1;i++){
            for(int j = 0;j<n-i-1;j++){
                if(arr[j]>arr[j+1]){
                    arr[j ^= arr[j+1];
                    arr[j+1 ^= arr[j];
                    arr[j ^= arr[j+1];
                    flag = 1;
                }
            }
            if(flag == 0)
                break;

        }
    }

    快速排序

    //快速排序
    STATUS quickSort(int *p,int low,int high){

        if(low < high){

            int pivot = p[low];
            int l = low;
            int h = high;

            while(l<h){
                while(p[h > pivot)
                    h--;
                p[l = p[h];
                while(p[l < pivot)
                    l++;
                p[h = p[l];
            }
            p[l = pivot;

            quickSort(p,low,l-1);//左递归
            quickSort(p,l+1,high);//右递归

        }
    }
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 15:10 , Processed in 0.392242 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表