几种常见的排序算法
冒泡排序
冒泡排序算法的運作如下:
1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2、對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。
3、針對所有的元素重復(fù)以上的步驟,除了最后一個。
4、持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。
void BubbleSort(int arr[], int n) {int i = 0, j =0; for(i = 0; i < n; i++)for(j = 0; j < n - 1 - i; j++){if(arr[j] > arr[j + 1]){arr[j] = arr[j] ^ arr[j+1];arr[j+1] = arr[j] ^ arr[j+1];arr[j] = arr[j] ^ arr[j+1];} } }交換兩個數(shù)據(jù),可以用用臨時變量,也可用以下的兩個方法
a = a^b;
b = a^b;
a = a^b;
或者
a = a + b;
b = a - b;
a = a - b;
冒泡排序變異版-雞尾酒排序法
/*** 雞尾酒排序法* *正常冒泡排序法,每次遍歷都是向一個方向冒出最值,*而雞尾酒排序法是變異的冒泡排序法,往返方向找出最值*/ public void sort(int[] a) {//需要來回a,length/2趟for (int i = 0; i < a.length / 2; i++) {//類冒泡,交換最大值至右端for (int j = i; 1 + j < a.length - i; j++)if (a[j] > a[1 + j])Arr.swap(a, j, 1 + j);//類冒泡,交換最小值至左端for (int j = a.length - i - 1; j > i; j--)if (a[j - 1] > a[j])Arr.swap(a, j - 1, j);} }冒泡排序改進版
/***改進的冒泡算法,在第i次遍歷時,若沒有交換數(shù)據(jù),說明剩余的數(shù)據(jù)已經(jīng)是有序的*/ void BubbleSort(int arr[]) {boolean didSwap;for(int i = 0, len = arr.length; i < len - 1; i++) {didSwap = false;for(int j = 0; j < len - i - 1; j++) {if(arr[j + 1] < arr[j]) {swap(arr, j, j + 1);didSwap = true;}}if(didSwap == false)return;} }選擇排序
選擇排序的工作原理:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
歸并排序
歸并操作的過程如下:
1、申請空間,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列
2、設(shè)定兩個指針,最初位置分別為兩個已經(jīng)排序序列的起始位置
3、比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
4、重復(fù)步驟3直到某一指針到達序列尾
5、將另一序列剩下的所有元素直接復(fù)制到合并序列尾
快速排序
快速排序的步驟
1.先從數(shù)列中取出一個數(shù)作為基準數(shù)。
2.分區(qū)過程,將比這個數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。
3.再對左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個數(shù)。
/** * @brief 快速排序* * @param list 要排序的數(shù)組* @param lIndex 左下標* @param rIndex 右下標*/ void QuickSort(int list[], int lIndex, int rIndex) {if (lIndex < rIndex){int i = lIndex, j = rIndex, x = list[lIndex];//第一個元素作為基準數(shù)while (i < j){while(i < j && list[j] >= x) // 從右向左找第一個小于x的數(shù)j--; if(i < j)list[i++] = list[j];while(i < j && list[i] < x) // 從左向右找第一個大于等于x的數(shù)i++; if(i < j)list[j--] = list[i];}list[i] = x;QuickSort(list, lIndex, i - 1); // 遞歸調(diào)用QuickSort(list, i + 1, rIndex);} }
總結(jié)
- 上一篇: Resources.getResourc
- 下一篇: java.lang.NoSuchMeth