1.冒泡排序
/**冒泡排序(稳定)
* 比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放
到数组后面。
* 最坏时间复杂度:O(n^2)
* 平均时间复杂度:O(n^2)
*/
public static int[] bubbleSort(int[] arr){
for(int i=0; i<arr.length-1; i++){
for(int j=0; j<arr.length-1-i; j++){
if(arr[j] > arr[j+1]){//从小到大排序
arr[j] = arr[j] + arr[j+1];
arr[j+1] = arr[j] - arr[j+1];
arr[j] = arr[j] - arr[j+1];
}
}
}
return arr;
}
2.冒泡排序优化
/**
* 冒泡排序优化
* 设一个flag,如果有序就不进行交换了,减少趟数
*/
public int[] bubbleSort2(int[] arr){
for(int i=0; i<arr.length-1; i++){
boolean flag = true;
for(int j=0; j<arr.length-1-i; j++){
if(arr[j] > arr[j+1]){
swap(arr,j,j+1);
flag = false;
}
}
if(flag){
break;
}
}
return arr;
}
public void swap(int[] arr,int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
3.选择排序
/**
* 选择排序
* 找最小数放在第一个位置、再在剩余书中找一个最小数放在第二个位置……直到最后两个数进行比较
*/
public int[] selectSort(int[] arr){
for(int i=0; i<arr.length-1; i++) {
int min = i;//记录最小值的下标
for (int j = i+1 ; j < arr.length; j++) {
if (arr[j] < arr[min]) {//还有更小的数,记录其下标
min = j;
}
}
if(min != i){//最小值放首位
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
return arr;
}
4.选择排序优化
/**
* 改进的选择排序
* 每一轮找出一个最小数和一个最大数,最小数放在第一个位置,最大数放在最后一个位置
* 可以减少循环的次数
* @param arr
*/
public int[] selectSort1(int[] arr){
int min = 0;
int max = 0;
int left = 0;
int right = arr.length -1;
while(left < right){
min = left;
max = left;
//找最大值、最小值的下标
for(int i=left; i<=right; i++){
if(arr[i] < arr[min]){
min = i;
}
if(arr[i] > arr[max]){
max = i;
}
}
//最大值放末尾
if(max != right){
int temp = arr[max];
arr[max] = arr[right];
arr[right] = temp;
}
//防止min位于最大值所要插入的位置
if(min == right){
min = max;
}
//最小值放首位
if(min != left){
int temp = arr[min];
arr[min] = arr[left];
arr[left] = temp;
}
left++;
right--;
}
return arr;
}