1.冒泡排序
冒泡排序是每次选出最大/小的数,将其排到末尾,选择过程是和每个数进行比较,n个数要排n次,第i次比较次数为n-i,所以算法如下
public void maopao(int[] arr){
for(int i=0;i<arr.length;i++){//比n次
for(int j=0;j<arr.length-i-1;j++){//每次都是从第0个开始比到第n-i个
if(arr[j]>arr[j+1]){
swap(arr[j],arr[j+1]);
}
}
}
}
2.选择排序
选择排序每次选出第i小/大的数,将其排在index为i的位置
public static void xuanze(int[] arr) {
for(int i=0;i<arr.length-1;i++) {//n个数排序只需要拍前n-1个,所以为length-1
int minIndex = i;//先假设index为i的是第i小的
for(int j=i+1;j<arr.length;j++) {//从第i加1位置开始比
minIndex = arr[minIndex]<arr[j]?minIndex:j;//选出最小数的index
}
if(minIndex!=i) {//第i不是第i小的话就交换
int tmp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tmp;
}
}
printArr(arr);
}
3.插入排序
插入排序是维护一个有序区,每次将新来的元素插入有序区使其继续保持有序
public static void charu(int[] arr) {
for(int i=1;i<arr.length;i++) {//默认第一个元素是有序的,所以从第二个开始插入
int tmpVal = arr[i];//先把要插入的元素保存下来
int j = i-1;//找到要插入元素的上一个元素
for(;j>0&&tmpVal<arr[j];j--) {//当要插入的元素小于index为j的元素,继续循环
arr[j+1] = arr[j];//将大于要插入元素的元素后移
}
arr[j+1] = tmpVal;//这个时候arr[j]>要插入元素的元素了,插入j+1位置
}
printArr(arr);
}
4.快速排序
快速排序是每次选一个基准数,然后让基准数的右边都是大于它,左边都是小于它,然后再以基准数的位置为分界点,继续排剩下的
public static void quickSort(int[] arr,int low,int heigh) {
if(low>=heigh) {//递归结束条件,当只排一个的时候
return;
}
int i = low;//i记录最左边的
int j = heigh;//j记录最右边的
int tmpVal = arr[low];//基准数选最左边的数
while(i<j) {//循环结束条件是i和j指向同一个数
while(tmpVal<=arr[j]&&i<j) {//j从最左边开始,当等于i,或找到一个小于基准数时停止,注:必须是小于,等于时不需要换,换会陷入死循环
j--;//j左移
}
while(tmpVal>=arr[i]&&i<j) {
i++;
}
if(i<j) {//当i!=j的时候交换ij元素
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
//循环结束,i=j
arr[low] = arr[i];//交换基准数与i=j位置元素的位置
arr[i] = tmpVal;
quickSort(arr, low, i-1);//递归左边
quickSort(arr, i+1, heigh);//递归右边
}