很簡單的一種排序,很容易理解,時間複雜度為o(n^2),空間複雜度為o(1),穩定的排序
基本思想:
其實就是從頭開始對整個陣列裡面的元素進行兩兩對比,比較大的元素放到後面,接著進行對比,知道最大的乙個元素被提取出來放到整個陣列的最後。然後再對剩下的元素進行相同的操作,直到整個陣列被排序完成。
**實現
public class bubblesort else }}}}}
優化一般氣泡排序也就是這樣寫。但是這段程式有個缺點,就是當排序過程中已經將陣列元素排序完成,但此時它仍然會去比較,這就做了無用功了,所以我們可以通過乙個boolean變數來優化這段代。
public class bubblesort else
}if (!flag) }}
}}
我們首先在開始迴圈時定義了乙個boolean變數為false,然後如果元素之間進行了交換,就將值置為true。所以,我們就可以通過這個boolean變數來判斷是否有元素進行了交換。如果boolean變數為false,則證明沒有元素進行交換,那麼久說明此時的陣列元素已經完成排序,那麼跳出外層迴圈即可,否則就繼續排序。
快速排序是對氣泡排序的一種改進。
時間複雜度:o(n*logn)、空間複雜度:o(logn)、不穩定
基本思想
任取待排序元素序列中的某元素作為基準值,按照排序碼將待排序集合分割成兩個子串行,左子串行中所有元素均小於基準值,右子串行中所有元素均大於基準值,然後最左右子串行重複該過程,直到所有元素都排列在相應位置上為止。
三種實現方式
前後指標法、二路快排、三路快排
**實現
public class quicksort
public static void quicksort2(int array)
public static void quicksort3(int array) else
long end = system.currenttimemillis();
system.out.println("三路快速排序共耗時:" + (end - start) + "毫秒");
}/**
* 快速排序獲取基準值
** @param data 待排序的陣列
* @param left 陣列最左元素
* @param right 陣列最右元素
* @return 返回已經到達最終位置的基準值下標
*/private static int partition(int data, int left, int right)
private static int partition2(int array, int l, int r)
swap(array, i, j);
i++;
j--;
}// 迴圈走完後,j索引下標為分割槽點位置
swap(array, l, j);
return j;
}private static void quicksortinternal2(int arr, int p, int r)
int q = partition2(arr, p, r);
quicksortinternal2(arr, p, q - 1);
quicksortinternal2(arr, q + 1, r);
}private static void quicksortinternal3(int arr, int l, int r)
// 隨機選取待排序陣列中的任意乙個元素
int randomindex = (int) (math.random() * (r - l + 1) + l);
swap(arr, l, randomindex);
int v = arr[l];
// arr[l+1...lt] < v
int lt = l;
// arr[lt+1...i-1] == v
int i = l + 1;
// arr[gt...r] > v
int gt = r + 1;
while (i < gt) else if (arr[i] > v) else
}// 迴圈走完只需要將l位置的元素與lt交換即為分割槽點
swap(arr, l, lt);
quicksortinternal3(arr, l, lt - 1);
quicksortinternal3(arr, gt, r);
}/**
* 快速排序遞迴版本
** @param array 待排序的陣列
* @param p 陣列起始位置
* @param r 陣列終止位置
*/private static void sortinternal(int array, int p, int r)
// 獲取分割槽點
int q = partition(array, p, r);
sortinternal(array, p, q - 1);
sortinternal(array, q + 1, r);
}private static void swap(int data, int indexa, int indexb)
}
快速排序的實現原理很簡單,就是將原陣列分成兩部分,然後以中間值為標準,比它小的就放其左邊,比它大的就放其右邊,然後在左右兩邊又以相同的方式繼續排序。
所以在**實現過程中,首先要建立兩個移動的變數,乙個從最左邊開始往右移動,乙個從最右邊開始往左移動,通過這兩個變數來遍歷左右兩部分的元素。當發現左邊有大於中間數的元素,右邊有小於中間數的元素,此時就進行交換。當兩個變數重合也就是相等的時候遍歷結束,然後左右兩部分作遞迴處理。
資料結構與演算法 交換排序
在處理資料的演算法當中,有幾種排序的方法 出入排序 交換排序和選擇排序。這幾種的排序方法中都各有特點。下面我們就來說一下當中的一種 交換排序。了解一種演算法,最基本的就是先從它的概念入手。它的基本思想是,在乙個待排序的序列的記錄中,任取乙個值為基準記錄,然後就以這個基準記錄為這個序列的界限,將待排序...
資料結構 交換排序
交換排序的基本思想是 兩兩比較待排序記錄的關鍵字,如果發生逆序 即排列順序與排序後的次序正好相反 則交換之,直到所有記錄都排好序為止。基本思路 每趟不斷將記錄兩兩比較,並按 前小後大 或 前大後小 規則交換。優點 每趟結束時,不僅能擠出乙個最大值到最後面位置,還能同時部分理順其他元素 一旦下趟沒有交...
資料結構 排序之交換排序
本節將兩種交換排序氣泡排序和快速排序 氣泡排序是最簡單的交換排序方法,比較相鄰兩個記錄的關鍵字,將大的放到右邊,小的放到左邊,如圖所示 從而使關鍵字小的左移 大的右移 每一次迴圈最右邊的必定是關鍵字最大的元素,外面再加一層迴圈即可得到有序序列。實現 include using namespace s...