插入排序
基本思想:
把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完爲止,得到一個新的有序序列。
void InsertSort(vector<int>&v)
{
for (int i = 1; i < v.size(); i++)
{
int k = v[i];
int j;
for ( j = i - 1; j >= 0; j--)
{
if (k < v[j])
v[j + 1] = v[j];
else
break;
}
v[j + 1] = k;
}
}
特性總結:
- 元素集合越接近有序,直接插入排序算法的時間效率越高。
- 平均時間複雜度:O(N^2)。
- 空間複雜度:O(1)。
- 穩定性:穩定。
希爾排序
基本思想:
把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。
void ShellSort(vector<int>&v)
{
int gap = v.size();
while (1)
{
gap = (gap / 3) + 1;
for (int i = gap; i < v.size(); i++)
{
int k = v[i];
int j;
for (j = i - gap; j >= 0; j = j - gap)
{
if (k < v[j])
v[j + gap] = v[j];
else
break;
}
v[j + gap] = k;
}
if (gap == 1)
{
break;
}
}
}
特性總結:
- 希爾排序是對插入排序的優化。
- 當 gap > 1時都是預排序,目的是讓數組更接近於有序。當gap == 1時,數組已經接近有序的了,這樣就會很快。整體而言,可以達到優化的效果。
- 時間複雜度:O(N ^ 1.3 ~ N ^ 2)。
- 穩定性:不穩定