给大家推荐个靠谱的公众号程序员探索之路,大家一起加油
public class ImproveSore {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {9,6,8,7,2,5,1,3,4};
selfSort(arr,0,arr.length - 1);
//searchMiddle(arr,0,(0 + (arr.length - 1)) / 2,arr.length - 1);
for(int num : arr){
System.out.print(num + " ");
}
System.out.println();
}
/*
* 昨天Java实现快排 那个算法 有缺陷 或者说 比较粗糙
* 因为 每次比较 都是 以第一个值 进行 比较的 也就是说 把 第一个值当做标杆
* 如果 数组的第一个 值 恰好是最大值 那么 昨天的算法时间复杂度就是 冒泡排序 这 当然不是 我们想要的
* 下面是 解决方案
*/
public static void selfSort(int[] arr,int start,int end){
if(start == end){
return;
}
int n = start;
int m = end;
//找出开始 中间 结束 这三个 的中值 然后就避免上面的缺陷缺陷
searchMiddle(arr,start,(start + end) / 2,end);
while(start != end){
for(;start < end;end--){
if(arr[end] < arr[start]){
swap(arr,start,end);
break;
}
}
for(;start < end;start++){
if(arr[start] > arr[end]){
swap(arr,start,end);
break;
}
}
}
if(start - 1 > n){
selfSort(arr,n,start - 1);
}
if(end + 1 < m){
selfSort(arr,end + 1,m);
}
}
/**
* 找出三个数中大小的中间数
* @param arr 数组
* @param l 下标值
* @param m
* @param n
*/
public static void searchMiddle(int[] arr,int l,int m,int n){
if(arr[l] > arr[m]){
swap(arr,l , m);
}
if(arr[n] > arr[m]){
swap(arr,n,m);
}
if(arr[l] < arr[n]){
swap(arr,l,n);
}
}
/**
* 交换函数 注意 这里 要 传数组的下标 如果 直接传数组值 那么 转变的结果 只在该方法中有效 因为 引用数据类型与 基础数据类型 之间的转变 不一样
* 例如 int a = 10;
* int b = a;
* b = 1;
* 那么 a还是 10
* 如果 int[] arr ={1,2,3};
* int[] arr2 = arr;
* arr2[0] = 100;
* 那么 arr[0] = 100;
* @param arr 要交换的数组
* @param i 要交换的下标
* @param j 要交换的下标
*/
public static void swap(int[] arr , int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}