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

来源:互联网 发布:农村淘宝服务站申请表 编辑:程序博客网 时间:2024/05/10 09:12

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

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));        }    }}
原创粉丝点击