本篇主要记录java 一些面试常用的
排序算法。
public class Sort {
public static void main(String[] args) {
Integer [] numberArr = {1,4,6,3,6,33,55,3,22,11}/*{111,22,334,55,3,55,667,7}*/;
//Integer [] numberArr = {1,22,33,55,66,99,667,999};
simpleSelectionSort(numberArr);
bubbleSort(numberArr);
quickSort(numberArr,0,numberArr.length-1);
Arrays.asList(numberArr).forEach(num ->{
System.out.println(num);
});
}
/**
* 简单选择排序: 时间复杂度
* 最优情况: n(n-1)/2 O(n^2)
* 最差情况:
*
*/
public static void simpleSelectionSort(Integer [] numberArr){
for (int i = 0; i < numberArr.length - 1; i++) {
for(int j = i+1 ; j <numberArr.length; j++) {
if(numberArr[i] > numberArr[j]) {
int tmep = numberArr[i];
numberArr[i] = numberArr[j];
numberArr[j] = tmep;
}
}
}
}
/**
* 冒泡排序 ; 时间复杂度即外循环和内循环以及判断和交换的时间开销
*
* 最优情况: n(n-1)/2 O(n^2) 当加上标志位可达到O(n) 只有外层循环,内层循环不执行则跳出循环break;
*
* 最差情况: 3n(n-1)/2 O(n^2)
*
* 平均: O(n^2)
*/
public static void bubbleSort(Integer [] numberArr) {
for(int i = 0; i < numberArr.length - 1; i++) {
for(int j = 0; j <numberArr.length - 1 -i; j++ ) {
if(numberArr[j]>numberArr[j+1]) {
int temp = numberArr[j+1];
numberArr[j+1] = numberArr[i];
numberArr[i] = temp;
}
}
}
Arrays.asList(numberArr).forEach(num ->{
System.out.println(num);
});
}
public static void quickSort(Integer [] numberArr,int low,int high){
if(low < high){
int middle = getMeddile(numberArr,low,high); //将numbers数组进行一分为二
quickSort(numberArr,low,middle-1); //对低字段表进行递归排序
quickSort(numberArr,middle+1,high); //对高字段表进行递归排序
}
}
/**
* 查找出中轴(默认是最低位low)的在numbers数组排序后所在位置
*/
public static int getMeddile(Integer numberArr[],int low,int high) {
int temp = numberArr[low]; //数组的第一个作为中轴
while(low < high) {
while(low < high && numberArr[high] >= temp) {
high--;
}
numberArr[low] = numberArr[high];
while(low < high && numberArr[low] <= temp) {
low++;
}
numberArr[high] = numberArr[low];
}
numberArr[low] = temp;
return low;
}
}
排序算法。