本篇主要讲解数组排序相关的三种算法,冒泡排序,直接排序和快速排序。
冒泡排序
算法说明
在数组中依次比较相邻的两个元素,当满足左侧大于右侧时(升序排序),则两个位置的元素互换。如此重复,最终即可完成数组的排序。
代码实现
public static void bubbleSort(int[] array){
// 循环轮数比数组大小小1轮
for(int i = 1; i < array.length; i++){
// 循环1轮后,最大的元素,已经排到数组后面,不用再参与比较
for(int j = 0; j < array.length - i; j++){
if(array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
直接选择排序
算法说明
依次找出数组中最小值的索引,并和数组左侧的元素进行位置交换。
这样从整体上就是数组的左侧部分是按照由小到大依次排列的有序数组。
代码实现
public static void selectSort(int[] array){
for(int i = 0; i < array.length - 1; i++){
// 记录比较的元素和索引
int min = array[i];
int minIndex = i;
for(int j = i + 1; j < array.length; j++){
if(array[j] < min){
// 记录最小值的索引和值
minIndex = j;
min = array[j];
}
}
// 将最小值与前面的元素交换
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
}
快速排序
算法说明
选择一个基准比较值,然后依据这个基准值,将数组分隔为两个部分,左侧的部分为所有小于基准的值,右侧部分为所有大于基准的值。
代码实现
/**
* 快速排序法,排序数组
* @author Ethan
* @description
* @param array
*/
public static void quickSort(int[] array){
subSort(array,0,array.length - 1);
}
/**
* 快速排序法的核心算法
* @author Ethan
* @description
* @param array 被排序的数组
* @param start 起始索引
* @param end 结束索引
*/
public static void subSort(int[] array, int start, int end){
if(start < end){
// 选取数组最左边的元素作为判断基础
int base = array[start];
int left = start;
int right = end + 1;
while(true){
// 从左向右遍历遇到大于基数的索引停止,left指向大于基数的索引
while(left < end && array[++left] <= base)
;
// 从右向左遍历找到小于基数的索引停止,right指向小于基数的索引
while(right > start && array[--right] >= base)
;
// 当大于基数的索引在小于基数的索引前时,进行交换,让小于基数的值都在左边,大于基数的值都在右边
if(left < right) {
swap(array,left,right);
}else{
break;
}
}
// 将基数和小于基数的最右边的元素位置对换
swap(array,start,right);
// 递归排序分割后的数组
subSort(array,start,right-1);
subSort(array,right + 1,end);
}
}
/**
* 交换数组中两个索引处的数值
* @author Ethan
* @description
* @param array
* @param left
* @param right
*/
public static void swap(int[] array, int left, int right){
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}