您的位置:首页 > 其它

快排改进 解决升序第一个是最大数 降序第一个是最小数问题

2017-08-20 11:14 405 查看
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
> arr[m]){
swap(arr,n,m);
}
if(arr[l] < arr
){
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐