冒泡排序经常是我们所接触到的第一个排序算法,因此思想也相对比较简单,它的原理就是按照索引(数组,集合等)顺序从前往后依次与它后面的元素一个一个进行比较。
public static void bubleSort(Integer[] arr){ for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } }
选择排序的核心思想就是从待排序的元素中找出最小的元素,我们可以把一组数据分为两部分,左边是排好的,右边是没有排好的。最初的时候,全是没有排序过的,我们此时假定arr[0]
,也就是minIndex=0
,这个位置的元素是最小的。然后我们依次把后面的元素与它进行比较,如果arr[j]比这个arr[minIndex]
还要小,那么我们就更新minIndex
->minIndex=j
的值,最后该轮循环结束后如果i
不等于minIndex
,我们就进行交换操作。接着i=1,minIndex=i,进行下一轮的操作。
public static void selectSort2(Integer[] arr){ for(int i=0;i<arr.length-1;i++){ int minIndex = i; for(int j=i+1;j<arr.length;j++){ if(arr[minIndex]>arr[j]){ minIndex=j; } } if(minIndex!=i) { int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } }
对于插入排序,我们可以将其与选择排序进行比,这两种排序我们都可以将其分为两部分,已经排好的(左边),没有排好的(右边)。选择排序是从从未排好的数组中选择最小的,而插入排序是按索引次序拿出元素,然后在已经排好序的数组中进行移动(一般从后向前移动)。
public void sort(Comparable[] arr){ for(int i=1;i<arr.length;i++){ //外循环 for(int j=i;j>0;j--){ //内循环 if(arr[j].compareTo(arr[j-1])<0){ Comparable temp = arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; } else{ break; , } } } }
public void sort2(Comparable[] arr){ for(int i=1;i<arr.length;i++){ Comparable e=arr[i]; int j; for(j=i;j>0;j--) { if(arr[j-1].compareTo(e)>0){ arr[j]=arr[j-1]; }else{ arr[j]=e; break; } } } }