黑馬程序員 Java基礎排序的一些應用
冒泡排序基本概念是:
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。
即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。
然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,
直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,
將最大的數放到了最後。在第二趟:仍從第一對數開始比較
(因爲可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),
將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),
第二趟結束,在倒數第二的位置上得到一個新的最大數
(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。
插入排序基本思想
將n個元素的數列分爲已有序和無序兩個部分,如插入排序過程示例下所示:
{{a1},{a2,a3,a4,…,an}}
{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}
{{a1(n-1),a2(n-1) ,…},{an(n-1)}}
每次處理就是將無序數列的第一個元素與有序數列的元素從後往前逐個進行比較,
找出插入位置,將該元素插入到有序數列的合適位置中。
快速排序:
* 一趟快速排序的算法是:
* 1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
* 2)以第一個數組元素作爲關鍵數據,賦值給key,即 key=A[0];
* 3)從j開始向前搜索,即由後開始向前搜索(j=j-1即j--),
* 找到第一個小於key的值A[j],A[i]與A[j]交換;
* 4)從i開始向後搜索,即由前開始向後搜索(i=i+1即i++),
* 找到第一個大於key的A[i],A[i]與A[j]交換;
* 5)重複第3、4、5步,直到 I=J;
* (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到爲止。
* 找到並交換的時候i, j指針位置不變。
* 另外當i=j這過程一定正好是i+或j-完成的最後令循環結束。)
*/
public class QuickSort {
public static void sort(int[] data) {
quickSort(data, 0, data.length - 1);
}
private static void quickSort(int[] data, int i, int j) {
int pivotIndex = (i + j) / 2;
// swap
SortTest.swap(data, pivotIndex, j);
int k = partition(data, i - 1, j, data[j]);
SortTest.swap(data, k, j);
if ((k - i) > 1)
quickSort(data, i, k - 1);
if ((j - k) > 1)
quickSort(data, k + 1, j);
}
/**
* @param data
* @param i
* @param j
* @return
*/
private static int partition(int[] data, int l, int r, int pivot) {
do {
while (data[++l] < pivot)
;
while ((r != 0) && data[--r] > pivot)
;
SortTest.swap(data, l, r);
} while (l < r);
SortTest.swap(data, l, r);
return l;
}
}
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。
即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。
然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,
直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,
將最大的數放到了最後。在第二趟:仍從第一對數開始比較
(因爲可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),
將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),
第二趟結束,在倒數第二的位置上得到一個新的最大數
(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。
插入排序基本思想
將n個元素的數列分爲已有序和無序兩個部分,如插入排序過程示例下所示:
{{a1},{a2,a3,a4,…,an}}
{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}
{{a1(n-1),a2(n-1) ,…},{an(n-1)}}
每次處理就是將無序數列的第一個元素與有序數列的元素從後往前逐個進行比較,
找出插入位置,將該元素插入到有序數列的合適位置中。
快速排序:
* 一趟快速排序的算法是:
* 1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
* 2)以第一個數組元素作爲關鍵數據,賦值給key,即 key=A[0];
* 3)從j開始向前搜索,即由後開始向前搜索(j=j-1即j--),
* 找到第一個小於key的值A[j],A[i]與A[j]交換;
* 4)從i開始向後搜索,即由前開始向後搜索(i=i+1即i++),
* 找到第一個大於key的A[i],A[i]與A[j]交換;
* 5)重複第3、4、5步,直到 I=J;
* (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到爲止。
* 找到並交換的時候i, j指針位置不變。
* 另外當i=j這過程一定正好是i+或j-完成的最後令循環結束。)
*/
public class QuickSort {
public static void sort(int[] data) {
quickSort(data, 0, data.length - 1);
}
private static void quickSort(int[] data, int i, int j) {
int pivotIndex = (i + j) / 2;
// swap
SortTest.swap(data, pivotIndex, j);
int k = partition(data, i - 1, j, data[j]);
SortTest.swap(data, k, j);
if ((k - i) > 1)
quickSort(data, i, k - 1);
if ((j - k) > 1)
quickSort(data, k + 1, j);
}
/**
* @param data
* @param i
* @param j
* @return
*/
private static int partition(int[] data, int l, int r, int pivot) {
do {
while (data[++l] < pivot)
;
while ((r != 0) && data[--r] > pivot)
;
SortTest.swap(data, l, r);
} while (l < r);
SortTest.swap(data, l, r);
return l;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.