冒泡排序思想:假定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]+" ");
}
}
运行结果:
选择排序思想:每次假定取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的相对位置前后顺序就破坏了)。
来源:51CTO
作者:wx5d3c7e0ad6c30
链接:https://blog.51cto.com/14472348/2479903