排序算法:把乱序的数组按照一定的顺序排列.
排序算法有很多,这里练习的是选择排序法和冒泡排序法.
int[] a= {1,5,9,3,6,2};
以上面这个数组为例,数组长度为6,元素分别为a[0]-a[5]
选择排序法 是对 定位比较交换法(也就是冒泡排序法) 的一种改进。选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。
package PracticeFunction;
//排序算法,生成一个随机数组按照从小到大的顺序排列
public class PrintChar {
public static void main(String[] args) {
int[] arr = {1,5,9,3,6,2};
printArr(arr);
//selectSort(arr);
bubbleSort(arr);
printArr(arr);
}
//选择排序法
public static void selectSort(int[] arr) {
for(int i=0;i<arr.length-1;i++) {
for(int j =i;j<arr.length;j++) {
if(arr[i]>arr[j]) {
exchange(arr,i,j);
}
}
}
}
//冒泡排序法
public static void bubbleSort(int[] arr) {
for(int i=0;i<arr.length-1;i++) {//第4轮a4和a5比较完成,排序已经完成了,下一轮a5就没有比较对象了,所以i取值范围为数组长度-1
for(int j=0;j<arr.length-1-i;j++) {//这里需要注意j的上限,若取值arr.length-i,则j最大值为6,到下一轮步读取a[j+1]时会读到a[6]报错.
if(arr[j]>arr[j+1]) {
exchange(arr,j,j+1);
}
}
}
}
//交换数组中两个元素的地址
public static void exchange(int[] arr,int a,int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//打印一个数组
public static void printArr(int[] arr) {
for(int i=0;i<arr.length;i++) {
if(i==arr.length-1) {
System.out.println(arr[i]);
}else {
System.out.print(arr[i]+",");
}
}
}
}
改良版的选择排序:
public static void selectSort(int[] arr) {
for(int i=0;i<arr.length-1;i++) {
int min = i;
for(int j =i;j<arr.length;j++) {
//每次比较只记下较小值的角标,每轮只交换一次
if(arr[i]>arr[j]) {
min = j;
}
else {
min =i;
}
}
exchange(arr,i,min);
}
}
如果内容有错误,恳请大佬们指出,感谢!