今天用java实现三个简单的排序算法:冒泡排序、选择排序、直接插入排序。
1.冒泡排序
冒泡排序过程:从前完后依次比较,将最大的数放到最后,重新开始前面的过程,将第二大的数放到倒数第二的位置,直到数组有序。
最开始有一个Test类用于获得要排序的数组,里面有两个函数Input(用于用于自己输入数组)和getRandomInput(用于随机获得用户想要个数的数组),这样可以比较好的测试,以后用到排序的时候都使用这个方法获取要排序的数组:
public class Test {
//通过scan一个一个读入数据,获取输入的数组
public List Input() {
List list = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
int length = 0;//数组长度
System.out.print("输入数组长度:");
length = scanner.nextInt();
System.out.print("输入排序数组:");
int count = 0;
while (length != count) {
list.add(scanner.nextInt());
count++;
}
System.out.print("输入的数组为:");
for (int j = 0; j < list.size(); j++) {
System.out.print(list.get(j) + " ");
}
return list;
}
public List getRandomInput() {
List list = new ArrayList<>();
System.out.print("输入随机数个数:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.print("sort before:");
boolean flag;
int a;
for (int i = 0; i < n; i++) {
flag = true;
//while循环是为了保证随机到的数组没有重复的,不然有时候如果范围比较小的下,重复比较高,这个并不影响,大家可以自行修改
while (flag) {
a = new Random().nextInt(100);
if (i == 0) {
list.add(a);
System.out.print(a + " ");
flag = false;
} else {
for (int j = 0; j < list.size(); j++) {
//判断list中是否存在a,如果不存在 就加入到list中
if ((int) list.get(j) == a) {
flag =true;
break;
}
flag = false;
}
if(!flag){
list.add(a);
System.out.print(a + " ");
}
}
}
}
System.out.print("\n");
return list;
}
}
这里解释一个问题,没有用到一般的数组,用到的是List,其实都是一样的,两个的区别简单一点说就是数组长度不能变,而List长度是可以变的。
冒泡排序java代码:
public class BubbleSort {
public static void main(String[] args) {
Test test = new Test();
List list = test.getRandomInput();
int n = list.size();
int i = 0;
int j = 0;
int k = 0;
int count = 1;
while ((n - 1) > 0) {
i = 0;
j = i + 1;
while (j != n) {
if ((int)list.get(i) > (int)list.get(j)) {
k = (int) list.get(j);
list.set(j, list.get(i));
list.set(i, k);
}
i = j;
j++;
}
System.out.print("第" + count + "趟排序结果:");
for (int m = 0; m < list.size(); m++) {
if(m == (list.size()-count)){
System.out.print("{" + list.get(m) + "} ");
}else System.out.print(list.get(m) + " ");
}
System.out.println();
count++;
n--;
}
}
}
测试结果:
2.选择排序
选择排序过程:每次从待排序的数组中选出最小或者最大的数,放到有序数组的最后面,当所有的数选择完之后就是有序的了
选择排序java代码:
public class SelectionSort {
public static void main(String[] args) {
SelectionSort selectionSort = new SelectionSort();
Test test = new Test();
List list = test.getRandomInput();
int n = list.size();
int min = 0;//保存最小值
int position = 0;//保存最小值位置
int k = 0;
for (int i = 0; i < n; i++) {
min = (int) list.get(i);
position = i;
for (int j = i; j < n; j++) {
if (min > (int) list.get(j)) {
min = (int) list.get(j);
position = j;
}
}
k = (int) list.get(position);
list.set(position, list.get(i));
list.set(i, k);
selectionSort.Print(list, n);
}
}
public void Print(List list, int n) {
System.out.print("sort after:");
for (int i = 0; i < n; i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
}
}
测试结果:
3.直接插入排序
直接插入排序过程:每次从待排序的数组中选择第一个,放到前面已经有序的数组里面,从后往前依次比较,保证有序插入,重复上面的操作指导所有的数有序。
直接插入排序java代码:
public class InsertionSort {
public static void main(String[] args){
Test test = new Test();
List list = test.getRandomInput();
int k=0;
int position=0;
for(int j =1;j<list.size();j++){
position =j;
for(int i = j-1;i>=0;i--){
if((int)list.get(position) < (int)list.get(i)){
k = (int)list.get(position);
list.set(position,list.get(i));
list.set(i,k);
position = i;
}
}
System.out.print("sort after "+j+" :");
for(int i =0;i<list.size();i++){
System.out.print(list.get(i)+" ");
}
System.out.println();
}
}
}
测试结果: