C语言、Java学习笔记(三)---几种简单的排序算法

假期已经过了一半,整个人都变得颓废了许多。今天没有出去玩,就学了几个简单的排序算法,以求安慰自己,好歹也是在假期里学习过了。(瘫~

C

这里一次性给出三种排序方法的代码,分别是冒泡排序,选择排序和归并排序。写完之后自己用简单的数据测了一下,均能够正常运行,但并不保证完全正确。

冒泡排序
按照我的理解,冒泡排序就是像鱼吐泡泡一样,让比较小的数据慢慢升到数组上方。它在代码实现时体现为,从底部开始,让数据两两比较,始终让比较小的那个数据放在上面。第一轮比较后,最小的数据就会排在第一位。n轮比较后,即可对这n个数排序。

/*冒泡排序的C语言实现*/

#include<stdio.h>
#include<stdlib.h>
int main(){
    int numbers[100]={0};//储存数据
    int n;//记录数字个数
    int t;//交换位置时的中间变量
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&numbers[i]);//读取数据
    }
    for(int i=1;i<=n;i++){
        for(int j=n;j>=i;j--){
            if(numbers[j]<numbers[j-1]){
                t=numbers[j];
                numbers[j]=numbers[j-1];
                numbers[j-1]=t;
            }
        }
    }
    for(int i=1;i<=n;i++)
        printf("%d ",numbers[i]);
    return 0;
}

选择排序
在我看来,选择排序的原理相对比较简单,就是找到最小值,让它和最前面的数据交换位置;然后找第二小的数据,与排在第二位的数据交换位置……找第n小的数据,与放在第n位的数据交换位置……

/*选择排序的c语言实现*/
#include<stdio.h>
#include<stdlib.h>
int main(){
    int numbers[100]={0};//建立数组并初始化
    int n;//记录数据数量
    int t;//交换时的中间变量
    int p;//记录需要交换的变量的下标
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&numbers[i]);//接收数据
    }
    for(int i=1;i<=n;i++){
        p=i;
        for(int j=i;j<=n;j++){
            if(numbers[j]<numbers[p])
                p=j;
        }
        t=numbers[p];
        numbers[p]=numbers[i];
        numbers[i]=t;
    }
    for(int i=1;i<=n;i++)
        printf("%d ",numbers[i]);
    return 0;
}

归并排序
归并排序的原理我能力有限,讲不太清楚,大概是用了递归的思想。简单来说,就是先把数据不断二分,分成许多部分,最终分成只含一个数据的小部分。对每个小部分排序,再给稍微大一点的部分排序,一层一层排序,最后得到完整排好序的数组。
归并排序不仅可以给数据排序,还可以用来求逆序对的数量,以后再详述。

/*归并排序的c语言实现*/
#include<stdlib.h>
#include<stdio.h>
int num1[100]={0};
int num2[100]={0};//临时储存数组
int main(){
    int n;
    void sort(int m,int n);//声明函数
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&num1[i]);
    sort(1,n);//调用归并排序函数
    for(int i=1;i<=n;i++){
        printf("%d ",num1[i]);
    }
    return 0;
}

void sort(int m,int n){//归并排序函数代码
    if(m==n) return;
    int p,t;
    int i,j;
    p=(m+n)/2;
    sort(m,p);
    sort(p+1,n);
    i=m;j=p+1;t=m;
    while(i<=p&&j<=n){
        if(num1[i]<num1[j])
            num2[t++]=num1[i++];
        else num2[t++]=num1[j++];
    }
    while(i<=p)
        num2[t++]=num1[i++];
    while(j<=n)
        num2[t++]=num1[j++];
    for(i=m;i<=n;i++){
        num1[i]=num2[i];
    }
    return;
}

Java

Java因为之前没有接触过,所以花了一些时间去搜索学习。但是搜索过程中发现Java的Java.util包里有一个叫Arrays.sort的方法,可以直接排序,于是本着不重复制造轮子的原则(其实是不会写又懒地找。。。),就直接写了一个排序的代码。

import java.util.*;
public class mppx {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();//记录数据个数
            int[] numbers=new int[n];//开数组记录数据
            for(int i=0;i<n;i++){
                numbers[i]=sc.nextInt();//接收数据
            }
            Arrays.sort(numbers);//排序
            System.out.println(Arrays.toString(numbers));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值