演算法原理(從小到大排序為例):
將陣列分成兩部分,左邊部分為已排序部分,右邊部分為未排序部分
從未排序部分的右側開始比較遍歷,相鄰兩個元素比較,保證小元素在前,即如果num[j]>num[j+1],就做元素交換,否則不交換
交換到左右兩部分的邊界處,右邊第乙個元素即為右邊部分最小元素,左邊最後乙個元素即為左邊部分最大元素,由於左邊部分是右邊部分每次從小到大氣泡排序出來的,所以此時左邊部分加上右邊第乙個元素為有序部分,有序部分的陣列下標加一。
空間複雜度o(1),時間複雜度o(n^2),屬於穩定排序
**如下:
/**
* 氣泡排序:從小到大排序,從後往前遍歷
* space:o(1)
* time:o(n^2)
* 穩定排序
* @param nums
*/public
static
void
bubblesort
(int
nums)}}
private
static
void
swap
(int
num,
int i,
int j)
演算法原理(從小到大排序為例):
將陣列分成兩部分,左邊部分為已排序部分,右邊部分為未排序部分
將未排序部分的第乙個元素選為比較元素,在已排序部分進行比較遍歷,從右往左,從大到小比較遍歷,每次比較都將比較過的元素後移一位,直至 比較元素大於等於遍歷元素,此時將比較元素加入陣列
空間複雜度:o(1),時間複雜度:o(n^2),屬於穩定排序
**如下:
/**
* 插入排序:從小到大排序,從後往前遍歷
* space:o(1)
* time:o(n^2)
* 穩定排序
* @param nums
*/public
static
void
insertionsort
(int
nums)
else
} nums[j+1]
= tmp;
//要麼是遍歷到頭,要麼是找到位置
}}
在真實的使用中,插入排序比氣泡排序使用更多,因為在比較遍歷時,插入排序移動元素比氣泡排序更少,而真實使用場景中,排序數量一般不大,10,100,1000,複雜度分析中忽略的低階,係數,常數得考慮到。後面的選擇排序,本身是不穩定演算法,先天就落了下乘
//冒泡3次
private
static
void
swap
(int
num,
int i,
int j)
//插入1次
nums[j+1]
= nums[j]
;
演算法原理(從小到大排序為例):
將陣列分成兩部分,左邊部分為已排序部分,右邊部分為未排序部分
從右側未排序部分選擇最小的元素,和未排序部分的第乙個元素交換位置
空間複雜度:o(1),時間複雜度:最好/最壞/平均 都是 o(n^2),屬於不穩定排序
如陣列:5,4,5,2 在選擇排序時,2與第乙個5交換位置,相對順序就被破壞了
**如下:
/**
* 選擇排序:從小到大排序
* space:o(1)
* time:o(n^2)
* 不穩定排序
* @param nums
*/public
static
void
selectionsort
(int
nums)
}swap
(nums,i,minindex);}
}
排序演算法 冒泡 插入 選擇排序
分析排序演算法從下列3個方面進行 排序演算法執行效率 時間複雜度 1 最好情況下時間複雜度 2 最壞情況下時間複雜度 3 平均情況時間複雜度 排序演算法記憶體消耗 空間複雜度,其中原地排序特指空間複雜度為o 1 的排序演算法 排序演算法穩定性 1 穩定的排序演算法 待排序的序列中存在值相等的元素,經...
演算法 插入選擇氣泡排序
演算法 排序 n 2 時間複雜度是o n 2 的排序有插入,選擇,冒泡。由於演算法思想比較簡單易懂,也不複雜。我們就簡單講講。插入排序 乙個元素是有序的,從第二個元素開始,依次將每個元素插入到前面序列的對應位置,最終整個序列有序。外層n 1趟。void insertsort int a,int n ...
冒泡,插入,選擇排序
經典的排序演算法,此文章介紹三個 氣泡排序 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。public void bubblesort int a while iswrap for int ...