冒泡排序思想:假定n个元素排序,需要进行n-1次比较,每趟比较每两两元素进行比较,每一趟比较取当前未排数据的最大值放在后面.无论原始数据的状态是怎样排的,时间复杂度都为O(N*N).(每一次排序的过程是将当前未排序数据的最大值放在后面)


public class BubbleSort {
	public static void bubbleSort(int[] arr) {
	if(arr == null || arr.length < 2) {
		return ;
	}
	for(int right = arr.length - 1; right > 0; right--) {
		for(int i = 0; i < right; i++)
			if(arr[i] > arr[i+1]) 
				swap(arr, i, i+1);
	}
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
	public static void main(String[] args) {
		int[] arr = new int[] {4,1,2,6,3,9,8,7};
		System.out.print("原始数组:");
		for(int i = 0; i < arr.length; i++)
		if(i != arr.length - 1)
			System.out.print(arr[i]+" ");
		else
			System.out.println(arr[i]);
		bubbleSort(arr);
		System.out.print("冒泡排序后:");
		for(int i = 0; i < arr.length; i++)
			System.out.print(arr[i]+" ");
	}
}

优化版:


public class BetterBubbleSort {
	public static void bubbleSort(int[] arr) {
	if(arr == null || arr.length < 2) {
		return ;
	}
	for(int right = arr.length - 1; right > 0; right--) {
		boolean flag = true;      //有无进行交换的标志
		for(int i = 0; i < right; i++)
			if(arr[i] > arr[i+1]) { 
				swap(arr, i, i+1);
				flag = false;
			}
		if(flag == true) {      //如果一趟比较没有交换数据,说明已排好序
			break;
		}
	}
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
	public static void main(String[] args) {
		int[] arr = new int[] {4,1,2,6,3,9,8,7};
		System.out.print("原始数组:");
		for(int i = 0; i < arr.length; i++)
		if(i != arr.length - 1)
			System.out.print(arr[i]+" ");
		else
			System.out.println(arr[i]);
		bubbleSort(arr);
		System.out.print("冒泡排序后:");
		for(int i = 0; i < arr.length; i++)
			System.out.print(arr[i]+" ");
	}
}

运行结果:

选择排序思想:每次假定取i为最小值的下标,然后比较过程中将比i更小的下标记录下来,最后放在未排序数据的前面,无论原始数据的状态是怎样排的,时间复杂度都为O(N*N).(每一次排序的过程是将当前未排序数据的最小值放在前面)


public class SelectSort {
	public static void selectSort(int[] arr) {
		if(arr == null || arr.length < 2)
			return ;
		for(int i = 0; i < arr.length - 1; i++) {
			int minIndex = i;
			for(int j = i + 1; j < arr.length; j++)
				minIndex = arr[j] < arr[minIndex] ? j : minIndex;
			swap(arr, i, minIndex);
		}
	}
	public static void swap(int[] arr, int i ,int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
	public static void main(String[] args) {
		int[] arr = new int[]{55,34,22,566,44,99,43,66};
		System.out.print("原始数组arr:");
		for(int i = 0; i < arr.length; i++)
		if(i != arr.length - 1)
			System.out.print(arr[i]+" ");
		else
			System.out.println(arr[i]);
		selectSort(arr);
		System.out.print("选择排序后:");
		for(int i = 0; i < arr.length; i++)
			if(i != arr.length - 1)
				System.out.print(arr[i]+" ");
			else
				System.out.println(arr[i]);
	}
}

运行结果:

冒泡排序优缺点:优点:比较简单,空间复杂度较低,是稳定的; 缺点:时间复杂度太高,效率慢; 选择排序优缺点:优点:一轮比较只需要换一次位置; 缺点:效率慢,不稳定(举个例子6,8,6,2, 9 第一遍选择元素2和第一个6交换,那么原序列中2个6的相对位置前后顺序就破坏了)。