劍指offer 排序演算法

2021-07-22 07:42:25 字數 1365 閱讀 5591

常用排序演算法自主手寫**:

1、氣泡排序 時間o(n^2),空間o(1),穩定,資料有序效果越好

void bubblesort(int a,int n)}}

//flag=1說明該趟不是全部都有序,需要繼續比較

//flag=0說明沒有進行互換,陣列已經有序了,沒有必要繼續比較,直接結束

}

2、選擇排序 時間o(n^2),空間o(1),不穩定,最好情況是資料有序

//3,1,3,2,4,6,8

//之所以不穩定,是因為排序過程中兩個相同元素的位置會改變

void selectsort(int a,int n)}}

}

3、插入排序 時間o(n^2),空間o(1),穩定,最好情況是資料有序

void insertsort(int a,int n)

a[j+1]=key;

}}

4、快速排序 時間o(nlogn),空間o(1),原址排序,不穩定

int partition(int a,int n,int low,int high)

}

5、堆排序 時間o(nlogn) 空間o(1) 原址排序 不穩定

//1.維護最大堆的性質

void maxheap(int a,int n,int i)

if(righta[largest])

if(largest!=i)

}//2.建立最大堆

void createmaxheap(int a,int n)

}//3.堆排序

void heapsort(int a,int n)

}

6、歸併排序 時間o(logn) 空間o(n) 穩定

//1.將有序的兩個陣列歸併為乙個有序的陣列

//陣列為以mid為中心兩邊都是有序的,需要將a[low]到a[mid]和a[mid]到a[high]合併

void merger(int a,int b,int low,int mid,int high)

while(i<=mid)

b[k++]==a[i++];

while(j<=high)

b[k++]=a[j++];

//特別注意:必須原址儲存,因為歸併排序的目的就是要求原來的資料越來越以中間線劃分為連續的兩段,必須儲存

for (int i=low;i<=high;i++)

a[i] = b[i];

}void mergesort(int a,int b,int low,int high)

}

《劍指Offer》 排序演算法

簡單排序 直接插入 直接選擇 冒泡 o n2 優化排序 希爾排序 堆排序 快速排序 o n log n 歸併排序。要能夠從時間複雜度 空間複雜度比較優缺點。陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸...

《劍指offer》 排序

一 資料流中的中位數 題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料...

演算法 劍指offer

思路 若百位上數字為0,百位上可能出現1的次數由更高位決定 若百位上數字為1,百位上可能出現1的次數不僅受更高位影響還受低位影響 若百位上數字大於1,則百位上出現1的情況僅由更高位決定。舉例 個位1出現的次數 round 1 1 每次迴圈1出現一次,0 9迴圈了53次,第54次迴圈為0 4 十位1出...