三种常用的排序方法(冒泡/选择/快速)
1、冒泡排序(Bubble Sort)O(n²)
/**
* 1.比较相邻两个数据如果。第一个比第二个大,就交换两个数
*
* 2.对每一个相邻的数做同样1的工作,这样从开始一队到结尾一队在最后的数就是最大的数。
*
* 3.针对所有元素上面的操作,除了最后一个。
*
* 4.重复1~3步骤,知道顺序完成。
*/
//外圈从0到n-1
for(int i=0;i<arr.length-1;i++){
//内循环从1到n
for(int j=i+1;j<arr.length;j++){
//每次对比两数,a>b交换,保持右边大于左边
if(arr[i]>arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
2.选择排序(SelectSrot)O(n²)
/**
* 1.在一个长度为 N 的无序数组中,第一次遍历 n-1 个数找到最小的和第一个数交换。
*
* 2.第二次从下一个数开始遍历 n-2 个数,找到最小的数和第二个数交换。
*
* 3.重复以上操作直到第 n-1 次遍历最小的数和第 n-1 个数交换,排序完成。
*/
for(int i = 0;i<arr.length-1;i++){
//记录第一个数的索引
int min = i;
//从1开始判断下个数时候小于最小数,若小于则最小索引置为此数
for(int j = i+1;j<arr.length;j++){
if(arr[j]<arr[min]){
min = j;
}
}
//将得到的最小数与第一个数交换
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
3.//快速排序(QuickSort)O (nlogn)
/**
* 二分思想
* 1.取数组第一个数arr[0]为基准数,记录此值
* 2.从arr[1]向右判断是否比基准数大,取第一个出现的数
* 从arr[arr.length-1]向左判断是否比基准数小,取第一个出现的数
* 3.判断2中两个数的index,i是否大于j,若i<j则两数交换
* 4.第一轮结束后,将基准数和重复1-3步骤操作
*/
private static void quickSort(int[] arr,int low,int high) {
if(low>high){
return;
}
int temp = arr[low];
int i = low;
int j = high;
while(i<j){
//!先从右向左判断,找到一个比基准数小的数
while(temp<=arr[j]&&i<j){
j--;
}
//从左到右判断,找到一个比基准数大的数
while(temp>=arr[i]&&i<j){
i++;
}
//判断两数索引大小
if(i<j){
int c = arr[i];
arr[i] = arr[j];
arr[j] = c;
}
}
//将基准数与排序后的左半段索引交换
arr[low] = arr[i];
arr[i] = temp;
//递归将左右两段继续排序
quickSort(arr, low, j-1);
quickSort(arr, j+1, arr.length-1);
}
排序速度:快速 > 选择 > 冒泡