氣泡排序
void
sort
(int
array)}if
(!ischarge)
}}
時間複雜度
空間複雜度
穩定性適合場景
o(n^2)
o(1)
穩定元素基本有序,數量較小
快排
遞迴從待排序區間選擇乙個數,作為基準值key;
partion: 遍歷整個待排序區間,將比基準值小的(可以包含相等的)放到基準值的左邊,將比基準值大的(可以包含相等的)放到基準值的右邊;
採用分治思想,對左右兩個小區間按照同樣的方式處理,直到小區間的長度 == 1,代表已經有序,或者小區間的長度 == 0,代表沒有資料。
void
quicksort
(int
arr,
int left,
int right)
else
}//三數取中
intgetindexofmiddle
(int
array,
int left,
int right)
else
if(array[mid]
>array[right]
)else
}else
else
if(array[mid]
)else}}
// hoare
intpartion
(int
arr,
int left,
int right)
while
(left>=arr[key])if
(left}swap
(arr,key,left)
;return left;
}//挖坑法
void
partion1
(int
arr,
int left,
int right)
arr[left]
=arr[right]
;while
(leftarr[right]
=arr[left];}
arr[left]
=key;
return left;
}int
partion2
(int
arr,
int left,
int right)
++cur;}if
(++prev!=right)
return prev;
}
非遞迴
void
quicksort
(int
array)
}}
時間複雜度
空間複雜度
穩定性適合場景
o(nlogn)
o(logn)
不穩定元素數量較大
歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。
void
sort
(int
arr)
void
mergesort
(int
arr,
int start,
int end)
}void
merge
(int
arr,
int left,
int mid,
int right)
else
}while
(p1<=mid)
while
(p2<=right)
system.
arraycopy
(tmp,
0,arr,left,tmp.length)
;}
非遞迴
void
mergesort1
(int
arr)
if(right>=arr.length)
merge
(arr,left,mid,right);}
gap<<=1;
}}
時間複雜度
空間複雜度
穩定性適合場景
o(nlogn)
o(n)
不穩定元素數量較大
void
countsort
(int
array)
if(array[i]
}int range=max-min+1;
int[
] arraycount=
newint
[range]
;for
(int i =
0; i )int index=0;
for(
int i =
0; i }
八大排序演算法
1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...
八大排序演算法
一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...
八大排序演算法
排序的定義 輸入 n個數 a1,a2,a3,an 輸出 n個數的排列 a1 a2 a3 an 使得a1 a2 a3 an in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序...