利用交換資料元素的位置進行排序的方法稱為交換排序。常用的交換排序有氣泡排序法和快速排序法。
1. 氣泡排序
基本思想:設陣列中a中存放了n個資料元素,迴圈進行n-1趟排序過程:第一趟時,依次比較相鄰的兩個資料元素,若為逆序,則交換兩個資料元素,這樣數值最大的資料將被放置在a[n-1]中,第二趟時,迴圈次數減1,資料元素個數為n-1,這樣整個n個資料元素中次大的資料元素被放置在a[n-1]中。直至所有的元素排列完成。有些待排序的資料元素序列已經基本有序,這樣,實際上並不需要全部執行完上述過程。可以在演算法中設計乙個flag變數,flag變數用於標記本次排序過程中是否有交換動作,若本次排序過程沒有交換動作則說明資料元素集合已全部排好。
冒泡演算法如下:
public
static
void
bubblesort(int arr)}}
}
總結:冒泡演算法的最好情況是資料元素集合已經全部排好序,這是迴圈n-1次,每次迴圈都因沒有交換動作而推出,因此氣泡排序演算法最好情況的時間複雜度為o(n);氣泡排序演算法最壞情況是資料元素集合全部逆序存放,這是時間複雜度為o(n^2)。氣泡排序的空間複雜度為o(1)。
氣泡排序在面試中會讓你寫遞迴形式:(主要思路就是每次冒泡會將最大的值移動到陣列尾端,每次遞迴的時候傳入的長度減1)
public
static
void
bubblerecursion(int arr, int n)
bubblerecursion(arr, n-1);
}}
2. 快速排序
基本思想:設陣列a中存放了n個資料元素,low為陣列的低端下標,high為陣列的高階下標,從陣列a中任取乙個元素作為標準元素,以該標磚元素為基準來調整陣列a中其他各個元素的位置,使排在標準元素前面的元素均小於標準元素,排在標準元素後面的均大於或等於標準元素。對這兩個陣列中的元素分別再進行方法類同的遞迴快速排序,演算法的遞迴出口條件是low>=high。
快速排序演算法如下:
public
static
void
quicksort(int arr, int low, int high)
public
static
intpartition(int arr, int low, int high)
arr[high] = key;
return high;
}
快速排序演算法的時間複雜度和各次標準資料元素的取法關係很大。若每次選取的標準元素都能均分兩個子陣列的長度,這樣的快速排序過程就是乙個完全二叉樹結果,這時分解次數等於完全二叉樹的深度logn,每次快速排序過程中無論把陣列怎樣劃分,全部的比較次數都接近於n-1次,所以最好情況下快速排序演算法的時間複雜度為o(nlogn)。
快速排序演算法的最壞情況是資料元素全部正序或反序有序,此時每次標準元素都把當前陣列分成乙個大小比當前陣列小1的子陣列,若把這樣的排序過程畫成二叉樹結果就是乙個二叉退化樹。乙個二叉退化樹的深度是n,所以最壞情況下的快速排序演算法的時間複雜度為o(n^2)。
一般情況下,資料元素的分布式隨機的,陣列分解構成的二叉樹深度接近於logn,所以快速排序的演算法的平均時間複雜度為o(nlogn)。
快速排序需要堆疊空間臨時儲存遞迴呼叫引數,堆疊空間的使用個數和遞迴呼叫的次數有關,因此最好情況下快速排序演算法的空間複雜度為o(logn);最壞情況下快速排序演算法的空間複雜度為o(n);平均空間複雜度為o(logn)。
快速排序演算法是一種不穩定的排序演算法。
歸併排序
歸併排序常用的是二路歸併排序。基本思想:設陣列a中存放了n個資料元素,初始時我們把它看做n個長度為1的有序子陣列,然後從第乙個子陣列開始,把相鄰的子陣列兩兩合併,得到n/2個長度為2的新的有序子陣列。對於這些新的有序子陣列再兩兩歸併,如此重複,直到得到乙個長度為n的有序陣列為止。
二路歸併排序演算法如下:
public
static
void
merge(int a, int swap, int k)
else
}while(i <= u1)
while(j <= u2)
l1 = u2 + 1;
}for(i = l1; i < n; i++, m++)
}public
static
void
mergesort(int a)
}
對n個元素進行一次二路歸併排序時,歸併的次數約為logn,任何一次的二路歸併排序元素的比較次數都約為n-1,二路歸併排序演算法的時間複雜度為o(nlogn),二路歸併排序使用了n個臨時臨時記憶體空間存放資料元素,所以二路歸併排序的空間複雜度為o(n)。
由於二路歸併排序演算法是相鄰有序子表的兩兩歸併,對於相同的兩個資料元素,能夠保證原來在前邊的元素排序後仍在前邊。因此,二路歸併排序演算法是一種穩定的排序演算法。二路歸併排序是唯一乙個不僅時間複雜度為o(nlogn),並且還是乙個穩定的排序演算法。
Java實現排序演算法 二
為了便於管理,先引入個基礎類 package algorithms author yovn public abstract class sorter e extends comparable e protected final void swap e array,intfrom intto 一 插入...
排序 排序演算法整理
經常零零散散的用到排序演算法,將幾類常見的總結下來 時間複雜度o n 2 空間複雜度o 1 穩定排序 param arr public static void insersort int arr else arr j 1 tmp 氣泡排序 時間複雜度 o n 2 空間複雜度o 1 穩定排序 para...
排序演算法整理
template void cinsertsort mysort function compare template void cselectsort mysort function compare swap datas i datas id void cshellsort mysort funct...