排序演算法 總結與複習

2022-04-12 12:24:11 字數 2004 閱讀 7973

直接插入排序:穩定排序 時間複雜度 o(n2)

void insertsort(int data, int

n)

if(j != i-1

) data[j+1] =temp;}}

view code

二分法插入排序:穩定排序 o(n2)

void binsort(int data, int

n)

for(int j = i-1; j >= left ; --j)

a[j+1] =a[j];

if(left !=i)

data[left] =temp;}}

view code

希爾排序: 不穩定排序 o(n1.3)

//

n data 的大小

//對於希爾排序,資料必須採用順序儲存的方式

void shellsort(int data, unsigned int

n) data[j+increment] =temp;}}

}

選擇排序: 不穩定排序(因為在選擇好後的交換過程中可能會打亂相應的順序)   o(n2)

void selectsort(int data, int

n) }}

堆排序: 不穩定(內部交換略亂 無法保證穩定) o(nlogn) 初始資料的排列對於工作效率沒有太大影響 (選擇排序大類)

//

資料儲存為1.。。n

void buildmaxheap(int a, int

n)void adjustdown(int a, int k, int

n)else

break

;

}

a[k] = a[0];}

//資料儲存為1.。。n

void heapsort(int a, int

n)}

氣泡排序:穩定排序   穩定

void bubblesort(int a, int

n)

}if(no_swap == true) break

; }

}

快排:最壞情況 o(n2) 一般 o(nlogn) 不穩定  對於排好序的比較次數為n2/2  

void quicksort(int a, int left, int

right)

a[i] =temp;

quick(a, left, i-1

); quick(a, i+1

, right);

}

快排非遞迴實現

int partion(vector &data, int low, int

high)

data[low] =pivot;

return

low;

}void qsort(vector &data, int low, int

high)

if(mid+1}}

歸併排序:穩定排序 輔助空間 o(n) 時間複雜度 o(nlogn) 

void merge(int a, int aa, int low, int mid, int

high)

while(i <= mid) aa[k++] = a[i++];

while(j <= high) aa[k++] = a[j++];

}void mergepass(int a, int aa, int n, int

length)

if(i + length -1

< n-1

) merge(a, aa, i, i+length-1, n-1

);

else

}void mergesort(int a, int

n)}

經典排序演算法複習總結

前置定義 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序。stable sort 插入排序 氣泡排序 歸併排序 計數排序 基數排序 桶排序。unstable sort ...

排序演算法複習

參考自 直接插入排序 從小到大排列 n個資料,第乙個資料平凡有序 假設前i 1個資料串有序,根據第i個的大小將第i個插入到此串中,則前i個的資料串也有序。因此可得到n個資料有序。插入方法 待插入元素為第i元素,數值存為temp,將 i 之前的元素 j 從第 i 1 元素開始與之比較 如果比temp大...

演算法複習 排序

排序中主要有插入排序 氣泡排序 歸併排序 快速排序等 主要從空間消耗 時間複雜度 最差時間複雜度等方面考慮演算法的好處 1.插入排序 插入排序是一種簡單直觀的排序演算法。它的工作原理非常類似於我們抓撲克牌 對於未排序資料 右手抓到的牌 在已排序序列 左手已經排好序的手牌 中從後向前掃瞄,找到相應位置...