比較類排序:
平均時間複雜度,最壞時間複雜度,最好時間複雜度。
穩定性:是否改變相對位置。針對a==b,本來a在b前,不穩定可能排序後a在b後。
1. 氣泡排序:
每次兩兩交換將較大(較小)放後面。
平均o(n2),最壞o(n2),最好(已排序好)o(n)。穩定
void
bubblesort
(vector<
int>
&nums)
}}
2. 選擇排序
每次選擇最大(最小)值放至最後(最前).
平均o(n2),最壞o(n2),最好o(n2)。不穩定
void
selectionsort
(vector<
int>
&nums)
}swap
(nums[maxn]
,nums[nums.
size()
-i-1])
;}}
3. 插入排序
將未排序部分首位從後向前搜尋插入已排序部分。
平均o(n2),最壞o(n2),最好o(n)。穩定
void
insertionsort
(vector<
int>
&nums)
nums[idx+1]
=tmp;
}}
4. 希爾排序
插入排序的改進版。將待排序陣列分為若干步長的子陣列,對子陣列進行插入排序。
平均o(n1.3),最壞o(n2),最好o(n)。不穩定:由於不同子陣列的插入排序,導致之間穩定性破壞。
void
shellsort
(vector<
int>
&nums)
nums[idx+gap]
=tmp;}}
}
5. 歸併排序
分治法。對每個子串行排序,合併子串行。
分治法:平均o(nlogn),最壞o(nlogn),最好o(nlogn)。穩定。
空間複雜度o(n)。空間換時間。
vector<
int>
merge
(vector<
int> l, vector<
int> r)
else}if
(l.size()
>
0) result.
insert
(result.
end(
), l.
begin()
, l.
end())
;else result.
insert
(result.
end(
), r.
begin()
, r.
end())
;return result;
}vector<
int>
mergesort
(vector<
int>
&nums)
6. 快速排序
分治法。選擇基準將其調整至正確位置,然後分別對左右遞迴排序。
平均o(nlogn),最壞o(n2),最好o(nlogn)。不穩定.
空間o(nlogn)
int
partition
(vector<
int>
&nums,
int left,
int right)
}swap
(nums[pivot]
,nums[index-1]
);return index-1;
}// or
intpartition
(vector<
int>
&nums,
int left,
int right)
nums[left]
=pivot;
return left;
}void
quicksort
(vector<
int>
&nums,
int left,
int right)
}
7. 堆排序
使用堆節點儲存資料以完成排序。堆是近似完全二叉樹的結構,滿足子節點的數值小於(大於)父節點。
大頂堆:父節點值大於等於子節點值,用於公升序排列(用於易取最大值放最後)
小頂堆:父節點值小於等於子節點值,用於降序排列
平均o(nlogn),最壞o(nlogn),最好o(nlogn)。不穩定.
空間o(1)。
// 調整最大堆
void
max_heapify
(vector<
int>
&nums,
int start,
int end)}}
void
heapsort
(vector<
int>
&nums,
int len)
}
二分查詢與氣泡排序
二分查詢 二分查詢又稱折半查詢是應用於有序數列中找到目標數的演算法。二分查詢較有序查詢的優點是比較次數少,查詢速度快,效能穩定 時間複雜度為o lgn 現在寫出乙個在數列arr 中找到目標數k 8的過程。int binary search int arr,int k,int sz else if a...
二分查詢與快速排序
可以在在二分查詢前進行排序,提高查詢效率。qsort 快速排序,需要自定義比較函式 和bsearch 配合使用。void qsort void base,size t nitems,size t size,int compar const void const void void bsearch c...
二分查詢排序
static final int n 15 static void quicksort int arr,int left,int right 快速排序演算法 if ltemp rtemp ltemp if leftx high mid 1 else low mid 1 return 1 未找到 pu...