排序上篇(選擇排序,氣泡排序,插入排序,希爾排序)
1.選擇排序
(1)原理:
在要排序的一組數中,用第一個數與後面的數依次進行判斷,若大於後面的則進行交換;然後依次再用第二個數與後面的數進行交換,如此迴圈到倒數第二個數和最後一個數比較為止。
(2)圖解:
內層第一次迴圈如下:
外層控制迴圈次數:
- 程式碼:
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { //使用巢狀迴圈,注意迴圈次數為陣列長度減1
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;
}
}
}
}
2.冒泡排序
(1)原理:
在要排序的一組數中,從頭開始用相鄰的兩個數依次進行比較,若第一個數大則調換位置,就這樣讓較大的數往下沉,較小的往上冒。如此迴圈到倒數第二個數和最後一個數比較為止。
(2)圖解:
(3)程式碼:
public static void bubbleSort(int[] arr){
for (int i = 0; i < arr.length-1; i++) { //外層迴圈確定迴圈次數:陣列長度減1
for (int j = 0; j < arr.length-1-i; j++) {//內層迴圈比較相鄰的元素,注意迴圈長度隨著確定個數遞減
if (arr[j] > arr[j + 1]) {
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
}
}
3.插入排序
(1)原理:
在要排序的一組數中,先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。
(2)圖解:(下圖黑色方框為排好序的,有下劃線是需要進行排序的數字,箭頭為插入的位置)
(3)程式碼:
public static void inserSort(int[] arr){
for (int i = 1; i < arr.length; i++) {
int j;
int num=arr[i];
for ( j=i;j>0&&arr[j-1]>num;j--){
arr[j]=arr[j-1];
}
arr[j]=num;
}
}
4.希爾排序
(1)原理:
在要排序的一組數中,先將整個待排序的記錄序列按某個增量d(n/2,n為要排序數的個數)分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
- 圖解:
(3)程式碼:
public static void shellSort1(int[] arr) {
int dk = arr.length/2;
while( dk >= 1 ){
ShellSort2(arr, dk);
dk = dk/2;
}
}
private static void ShellSort2(int[] a, int dk) {//類似插入排序,只是插入排序增量是1,這裡增量是dk,把1換成dk就可以了
for(int i=dk;i<a.length;i++){
if(a[i]<a[i-dk]){
int j;
int x=a[i];//x為待插入元素
a[i]=a[i-dk];
for(j=i-dk; j>=0 && x<a[j];j=j-dk){//通過迴圈,逐個後移一位找到要插入的位置。
a[j+dk]=a[j];
}
a[j+dk]=x;//插入
}
}
}