排序的介紹
- 排序是將多個數據,依指定的順序進行排列的過程。
1. 排序的分類:
- 內部排序:
指將需要處理的所有數據都加載到內部存儲器中進行排序。包括(交換式排序法、選擇
式排序法和插入式排序法); - 外部排序法:
數據量過大,無法全部加載到內存中,需要借助外部存儲進行排序。包括(合並排序法和直接合並排序法)。
2. 冒泡排序法
- 冒泡排序(Bubble Sorting)的基本思想是:通過對待排序序列從后向前(從下標較大的元素開始),依次比較相鄰元素的值,若發現逆序則交換,使值較大的元素逐漸從前移向后部,就像水底下的氣泡一樣逐漸向上冒。
3. 冒泡排序法案例:
BubbleSort.java
- 下面我們舉一個具體的案例來說明冒泡法。我們將五個無序:
24,69,80,57,13
使用冒泡排序法將其排成一個從小到大的有序數列。 - 圖像分析:
思路:
- 化繁為簡,先死后活
數組 [24,69,80,57,13]
第1輪排序: 目標把最大數放在最后
第1次比較[24,69,80,57,13]
第2次比較[24,69,80,57,13]
第3次比較[24,69,57,80,13]
第4次比較[24,69,57,13,80]
int[] arr = {24, 69, 80, 57, 13};
int temp = 0; //用於輔助交換的變量
for( int j = 0; j < 4; j++) {//4次比較
//如果前面的數>后面的數,就交換
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("==第1輪==");
for(int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
/* 第2輪排序: 目標把第二大數放在倒數第二位置 第1次比較[24,69,57,13,80] 第2次比較[24,57,69,13,80] 第3次比較[24,57,13,69,80] */
for( int j = 0; j < 3; j++) {//3次比較
//如果前面的數>后面的數,就交換
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("\n==第2輪==");
for(int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
//第3輪排序: 目標把第3大數放在倒數第3位置
//第1次比較[24,57,13,69,80]
//第2次比較[24,13,57,69,80]
for( int j = 0; j < 2; j++) {//2次比較
//如果前面的數>后面的數,就交換
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("\n==第3輪==");
for(int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
/* 第4輪排序: 目標把第4大數放在倒數第4位置 第1次比較[13,24,57,69,80] */
for( int j = 0; j < 1; j++) {//1次比較
//如果前面的數>后面的數,就交換
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("\n==第4輪==");
for(int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
- 將多輪排序使用外層循環包括起來即可
先死后活=> 4
就是arr.length - 1
int[] arr = {24, 69, 80, 57, 13};
int temp = 0; //用於輔助交換的變量
//將多輪排序使用外層循環包括起來即可
//先死后活 =》 4就是 arr.length - 1
for( int i = 0; i < arr.length - 1; i++) {//外層循環是4次
for( int j = 0; j < arr.length - 1 - i; j++) {//4次比較-3次-2次-1次
//如果前面的數>后面的數,就交換
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("\n==第"+(i+1)+"輪==");
for(int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + "\t");
}
}