java冒泡排序法优化

/*
 * 作者:姬灬剌
 * 日期:2016年6月26日
 * 功能:冒泡排序法
 * 总结:
 * 基本思想:通过对待排序序列从后向前(从下表较大的元素开始),依次比较相邻元素的排序码,
 * 若发现逆序则交换,使排序码较小的元素逐渐从后部移动到前部;
 * 因为在排序过程中,各元素在不停地接近自己的位置,如果一次比较下来没有发生任何改变,则说明
 * 序列排序完成,故需要在排序过程中设置一个标识flag判断元素是否交换过,从而减少不必要的比较
 * 
 */
package com.st.paixu;

import java.util.Random;

public class maopao {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  // 定义一个int类型的数组,设置长度为length
  int length = 8;
  int[] arr = new int[length];
  // 随机生成arr数组的元素
  for (int i = 0; i < arr.length; i++) {
   arr[i] = new Random().nextInt(10);
  }
  // 实例化一个MpSort类的对象
  MpSort ms1 = new MpSort();
  // 打印数组
  System.out.println("排序前:");
  ms1.printArr(arr);
  ms1.sort(arr);
  System.out.println("\n排序后:");
  ms1.printArr(arr);
 }
}

// 定义一个冒泡排序的类:MpSort
class MpSort {
 public boolean flag = true;

 // 成员方法:排序
 // 外层循环设置排序次数
 // 定义一个游标变量
 public int[] sort(int[] arr) {
  int temp = 0;
  for (int i = 0; i < arr.length - 1; i++) {
   // 内层循环进行位置冒泡
   for (int j = 0; j < arr.length - 1 - i; j++) {
    flag = true;
    if (arr[j] > arr[j + 1]) {
     temp = arr[j];
     arr[j] = arr[j + 1];
     arr[j + 1] = temp;
     flag = false;
    }
   }
   //flag要在外层,即完成一次冒泡后,若flag值不更改为false,则未进入交换代码段,进而跳出循环
   if (flag) {
    break;
   }
   //System.out.println("\n排序中:");
   //printArr(arr);
  }
  return arr;
 }
 // 打印数组
 public void printArr(int[] arr) {
  for (int i = 0; i < arr.length; i++) {
   System.out.print(arr[i] + " ");
  }
 }
}

猜你喜欢

转载自wangzhen-2357.iteye.com/blog/2307423