排序一:冒泡以及三种优化

/**
 * 冒泡以及三种优化
 * */

public class One {
    /**
     * 经典
   *N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)  *
*/ public static void one(int[] arr) { for(int i=0;i<arr.length-1;i++) { for(int j=1;j<arr.length-i;j++) { if(arr[j-1] > arr[j]) { int temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; } } } } /** *优化一 ,加入标志,判断上一轮是否有过交换 **/ public static void two(int[] arr) { boolean exchange = false; for(int i=0;i<arr.length-1;i++) { //比较n-1趟 for(int j = 1;j <arr.length-i;j++) { //j从1开始, 有i个数据已经排序好了 if(arr[j-1] >arr[j]) { int temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; if(!exchange) exchange = true; } } if(!exchange) break;//判断这一趟是否有交换数据,没有交换数据表明已经排好序 } } /** * 优化二,在每一趟中,对已经排好序的不去进行比较 * */ public static void three(int[] arr) { int end = 1; int pos = 1; while(end >0) { for(int j = 1;j <end;j++) { //j从1开始, 有i个数据已经排序好了 if(arr[j-1] >arr[j]) { int temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; pos = j; } } end = pos - 1; } } /** * 优化三、每次循环,正反两次冒泡 * */ public static void four(int[] arr) { int temp =0; int low =0; int high = arr.length-1; int count =1;//躺数 while(low<high) { for(int i = low;i<high;i++) { //正向冒泡,确定最大值 if(arr[i] >arr[i+1]) { temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } --high; //最后一个确定 for(int i = high ;i>low ;i--) { //确定最小值 if(arr[i] < arr[i-1]) { temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } ++low;//第一个确定了 } } }

 

转载于:https://www.cnblogs.com/ZeGod/p/9969525.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值