一、选择排序
选择排序就是找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
//比值交换
public void swap(int[] arr, int i,int j){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
public int[] selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return null;
}
//0~n-1 范围进行排序 确定第0位为最小值
//1~n-1 范围排序 确定第1位
//...
//n~n-1 范围 确定第n位
for (int minIndex, i = 0; i < arr.length; i++) {
//minIndex:i~n-1范围内最小的值
//先假定第一个数为最小值
minIndex = i;
//i+1,i+2,...,i+10,...
//i+10,位置上的数小于i+1 位置交换 minIndex = j;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
swap(arr,i,minIndex);
}
return arr;
}
二、冒泡排序
冒泡排序就是将最大的值交换到最右边,先确定整个数组的终点,从左往右依次比值排序,将最大值排到最右侧。
//比值交换
public void swap(int[] arr, int i,int j){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
//冒泡排序
public static int[] bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return null;
}
//确定数组每次循环的终点
//0~n-1 范围 谁大谁往后 依次交换 确定第n-1位
//0~n-2 范围 确定第n-2位
//...
//0~1 范围 确定第1位
for(int end = arr.length - 1; end > 0; end--){
//从0位开始交换冒泡
for (int i = 0; i < end; i++) {
if(arr[i]>arr[i+1]){
swap(arr,i,i+1);
}
}
}
return arr;
}
三、插入排序
通常人们整理牌的方法是一张一张的来,将每一张牌插人到其他已经有序的牌中的适当位置。在计算机的实现中,为了给要插人的元素腾出空间,我们需要将其余所有元素在插人之前都向右移动一位。这种算法叫做插入排序
//比值交换
public void swap(int[] arr, int i,int j){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
//插入排序
public static int[] insertSort(int[] arr) {
if(arr == null || arr.length < 2){
return null;
}
//从第2个元素开始排序
//第一个元素不能比值
for(int i = 1; i < arr.length; i++){
//从当前元素左边第一个元素开始,向左找位置//
//0~1 第一个元素和第二个元素比值,如果第一个元素大于第二个元素 插入到前面结束这一轮
//0~2 第三个元素j+1依次与第二个元素j比较,如果第二个大于第三个元素交换,j-- 然后与第一个元素进行比较。
//...
//0~n-1
for(int j = i-1;j>=0 && arr[j]>arr[j+1];j--){
swap(arr,j,j+1);
}
}
return arr;
}