每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止;
待排序的記錄放在陣列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方法來表示。在後面我將 給出詳細的說明。對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。我將按照演算法的複雜度...