package cn.alan;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nums = {3, 4, 2, 1, 5, 6, 7, 8, 9};
Sort sort = new Sort();
//冒泡排序V1
sort.BubbleSortV1(nums);
//冒泡排序V2
sort.BubbleSortV2(nums);
//冒泡排序V3
sort.BubbleSortV3(nums);
}
}
class Sort {
/**
* 1、比较两个相邻元素,如果前一个比后一个大,则交换这两个相邻元素
* 2、对未排序的序列重复上述步骤,每一轮排序结束后,都会将未排序序列中的最大值置于序列的最后
* 3、每一轮排序结束后,需要排序的的元素也会随之减少一个,直至没有任何一对数字需要比较
* @param nums
*/
public void BubbleSortV1(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums.length - i-1; j++) {
if (nums[j] > nums[j+1]) {
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
System.out.println("冒泡排序V1:"+Arrays.toString(nums));
}
/**
* 设置sign标志,当某一趟排序时,不再交换相邻的两数时,则停止排序
* @param nums
*/
public void BubbleSortV2(int[] nums){
for (int i=0;i<nums.length;i++){
//记录冒泡排序是否有进行交换
boolean sign=false;
for (int j=0;j<nums.length-i-1;j++){
if ( nums[j]>nums[j+1]) {
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
sign=true;
}
}
if (!sign){
break;
}
}
System.out.println("冒泡排序V2:"+Arrays.toString(nums));
}
/**
* 设置sign标志和borderSort边界。borderSort边界让每一次交换都发生在无序区。
* @param nums
*/
public void BubbleSortV3(int[] nums){
int borderSort=nums.length-1;
int lastExchangeIndex=0;
boolean sign=false;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < borderSort; j++) {
if (nums[j]>nums[j+1]) {
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
sign=true;
//更新最后一次数据交换的下标
lastExchangeIndex=j;
}
}
if (!sign) {
break;
}
//更新数据无序区的边界
borderSort=lastExchangeIndex;
}
System.out.println("冒泡排序V3:"+Arrays.toString(nums));
}
}
冒泡排序
最新推荐文章于 2024-07-25 23:26:35 发布