排序 各種排序演算法

2022-08-13 07:12:11 字數 1701 閱讀 5506

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止;

待排序的記錄放在陣列r[0, n - 1]中;

排序過程中將r分成兩個子區間,有序區r[0, i-1], 無序區r[i, n - 1];

將當前無序區的第1個記錄,插入到有序區中適當的位置上;

每次是有序區增加乙個記錄,知道插入完畢為止

o(n^2) 穩定排序
#include using namespace std;

const int n = 100010;

int a[n];

void insert_sort(int a, int n)

}int main()

//順序移動進行插入

for(int j = i - 1; j >= r + 1; j--)

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

a[r + 1] = tmp;

}}int main()

a[j + gap] = tmp;

j -= gap;

}gap /= 2;

}}int main()

}int main()

quick_sort(a, l, j);

quick_sort(a, j + 1, r);

}int main()

}int main()

}int main()

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

while(j <= r) tmp[k++] = a[j++];

for(int i = l, j = 0; i <= r; i++, j++) a[i] = tmp[j];

}int main()

{ int n;

cin>>n;

for(int i = 0; i < n; i++)

cin>>a[i];

merge_sort(a, 0, n - 1);

for(int i = 0; i< n; i++)

cout統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項

根據c[i]的值,整理排序結果

時間複雜度o(n + maxnum) 空間複雜度一般較高

適合於關鍵字數值密集的場合中

通過「分配」和「收集」來實現排序,借助多關鍵字排序的思想對單關鍵字排序

先按照最低位的值對記錄進行分配、收集;

在前一趟的基礎上,在對高位的值分配和收集,直至最高位,則完成了基數排序的整個過程

時間複雜度o(d(n + r)) 分配o(n) 收集o(r) 分配-收集d趟

若n較小(小於50),直接插入排序和直接選擇不錯

資料基本有序,選用直接插入、冒泡、隨機的快速排序;

n較大,用o(nlogn)的演算法

1) 快速排序當關鍵字的隨機分布好時用

2) 堆排序空間複雜度好,且不會出現快速排序的最壞情況

3) 歸併排序是穩定演算法

基數排序可能在o(n)內完成,單關鍵字型別受限

各種排序演算法

交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...

各種排序演算法

include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...

各種排序演算法

排序演算法是一種基本並且常用的演算法。由於實際工作中處理的數量巨大,所以排序演算法 對演算法本身的速度要求很高。而一般我們所謂的演算法的效能主要是指演算法的複雜度,一般用o方法來表示。在後面我將 給出詳細的說明。對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。我將按照演算法的複雜度...