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