一.冒泡排序
原理:比較兩個相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個數,將小數放在前面,大數放在后面。
即在第一趟:首先比較第1個和第2個數,將小數放前,大數放后。
然后比較第2個數和第3個數,將小數放前,大數放后,如此繼續,直至比較最后兩個數,將小數放前,大數放后。
重復第一趟步驟,直至全部排序完成。
舉例說明:要排序數組:int[] arr={6,3,8,2,9,1};
第一趟排序:
第一次排序:6和3比較,6大于3,交換位置: 3 6 8 2 9 1
第二次排序:6和8比較,6小于8,不交換位置:3 6 8 2 9 1
第三次排序:8和2比較,8大于2,交換位置: 3 6 2 8 9 1
第四次排序:8和9比較,8小于9,不交換位置:3 6 2 8 9 1
第五次排序:9和1比較:9大于1,交換位置: 3 6 2 8 1 9
第一趟總共進行了5次比較, 排序結果: 3 6 2 8 1 9
算法實現:
public static int[] bubbleSort3(int []data) {
int temp;
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data.length-i-1; j++) {
if (data[j]>data[j+1]) {
temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
}
}
}
return data;
}
二.快速排序
原理:對于給定的一組記錄,選擇一個基準元素,通常選擇第一個元素或者最后一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分,直到序列中的所有記錄均有序為止。
舉例說明:
一趟排序的過程:

算法如下:
public void fastSort(int[] a,int low,int high){
int start = low;
int end = high;
int key = a[low];
while(end>start){
//從后往前比較
while(end>start&&a[end]>=key) //如果沒有比關鍵值小的,比較下一個,直到有比關鍵值小的交換位置,然后又從前往后比較
end--;
if(a[end]<=key){
int temp = a[end];
a[end] = a[start];
a[start] = temp;
}
//從前往后比較
while(end>start&&a[start]<=key)//如果沒有比關鍵值大的,比較下一個,直到有比關鍵值大的交換位置
start++;
if(a[start]>=key){
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
//此時第一次循環比較結束,關鍵值的位置已經確定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大,但是兩邊的順序還有可能是不一樣的,進行下面的遞歸調用
}
//遞歸
if(start>low) sort(a,low,start-1);//左邊序列。第一個索引位置到關鍵值索引-1
if(end<high) sort(a,end+1,high);//右邊序列。從關鍵值索引+1到最后一個
}
}
三.插入排序
原理:插入排序就是把當前待排序的元素插入到一個已經排好序的列表里面。
算法如下:
public static void insertSort(int[] array) { if (array == null || array.length < 2) { return; } for (int i = 1; i < array.length; i++) { int currentValue = array[i]; int position = i; for (int j = i - 1; j >= 0; j--) { if (array[j] > currentValue) { array[j + 1] = array[j]; position -= 1; } else { break; } } array[position] = currentValue; } }
新聞熱點
疑難解答