排序與二分查詢

2021-10-07 13:09:52 字數 2766 閱讀 3443

比較類排序:

平均時間複雜度,最壞時間複雜度,最好時間複雜度。

穩定性:是否改變相對位置。針對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...