資料結構與演算法 交換排序

2021-09-27 04:45:15 字數 3179 閱讀 1033

很簡單的一種排序,很容易理解,時間複雜度為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...