学习开发一年的时间里,很少去了解排序算法,冒泡排序也是最开始学习的样子,靠死记硬背,没有引入自己的理解。
对于什么时间复杂度和空间复杂度和稳定性也不清楚其原委,或许在代码方面少了几许的天分:
冒泡排序:
冒泡排序每一轮的比较都是前面的数和后面的数进行比较,并交换位置,每一轮结束,最大值就位于序列末尾。
下面代码是最初的冒泡排序代码:
public class bubbleSort {
public static void sort(int[] arr) {
for(int i=0;i<arr.length-1;i++) {
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
int num = arr[j];
arr[j]=arr[j+1];
arr[j+1]=num;
}
}
}
}
public static void main(String[] args) {
int[] arr = {20,40,30,10,60,50};
sort(arr);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
因为冒泡排序,是前后两个数进行比较,即使一个序列后半部分是一个有序的序列,冒泡排序还是挨个进行比较这样就比较浪费时间。 通过添加一个标识符,如果有一轮比较,标识符没有改变,就结束循环。
代码如下:
public class bubbleSort {
public static void main(String[] args) {
int[] arr = {49,38,65,97,76,27,49};
bubbleSort(arr);
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
}
public static void bubbleSort(int[] arr){
boolean flag;//
for(int i = arr.length-1; i > 0; i--){
flag = false;
for(int j = 0; j < i; j++){
if(arr[j] > arr[j+1]){
swap(arr,j,j+1);
flag = true;
}
}
if(!flag){
return;
}
}
}
public static void swap(int[] arr,int m,int n){
int num = arr[m];
arr[m] = arr[n];
arr[n] = num;
}
}
冒泡排序是稳定的,因为当a = b时,只有大于才进行位置的交换,故 a 和 b 的位置没有计划进行交换,所以算法稳定。