排序 插入排序

插入排序算法

    插入排序的基本思想爲逐個考察每一個待排序元素,將每個新元素插入到前面已經排好序的序列中適當的位置上,使得新序列仍然是一個有序序列。插入排序可分爲直接插入排序希爾排序shell

1.直接插入排序數組

  介紹:直接插入排序是一種最簡單的排序方法,它的基本操做是將一個記錄插入到已排好序的有序表中,從而獲得一個新的、記錄數增長1的有序表。
優化

  步驟:
spa

  1. 從第一個元素開始,該元素能夠認爲已經被排序
  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描
  3. 若是該元素(已排序)大於新元素,將該元素移到下一位置
  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
  5. 將新元素插入到該位置中
  6. 重複步驟2

  程序實現:code

 

 1 void InsertSort(int* _array, int _arraySize)
 2 {
 3     assert(_array&&_arraySize > 0);//參數判斷
 4 
 5     for (int i = 1;i < _arraySize;++i)//從數組第二個數開始插入
 6     {
 7         for (int j = i - 1;j >= 0;--j)
 8         {
 9             if (_array[j] > _array[j + 1])//從後進行插入
10             {
11                 swap(_array[j], _array[j+1]);
12             }
13             else//(_array[j] <= _array[j+1])
14             //進行優化,說明前面數據均小於_array[j+1]直接跳出循環
15                 break;
16         }
17     }
18     return;
19 }

 

  效率分析:blog

  算法穩定性:穩定
排序

  時間複雜度:O(n^2)
get

  空間複雜度:O(1)
it

2.希爾排序

  介紹:希爾排序又稱"縮小增量排序",它的基本思想是 先將整個待排序分割成1若干子序列分別進行直接插入排序,待整個序列"基本有序"時,再對全體進行一次直接插入排序。希爾排序實質上是一種分組直接插入排序而後逐步合併的過程,其在時間效率上較直接插入排序有較大改進。

  步驟:

  http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/shell_sort.asp

   經過上述網址可完全瞭解希爾排序的步驟。

  程序實現:

 

 1 void ShellSort(int* _array,int _arraySize)
 2 {
 3     assert(_array&&_arraySize > 0);
 4     int gap = _arraySize;
 5     while (gap > 1)
 6     {
 7         gap = gap / 3 + 1;//設置希爾排序增量,保證最後一次排序時gap爲1即直接插入排序
 8 
 9         for (int i = gap;i < _arraySize;i += gap)//從數組第gap個元素開始
10         {
11             for (int j = i - gap;j >= 0;j -= gap)
12             {
13                 if (_array[j] > _array[j + gap])
14                 {
15                     swap(_array[j], _array[j + gap]);
16                 }
17                 else if (gap == 1)//在最後直接插入排序時進行優化
18                     break;
19             }
20         }
21     }
22     return;
23 }

  效率分析:

   算法穩定性:不穩定

   時間複雜度:O(n^1.3)

   空間複雜度:O(1)

相關文章
相關標籤/搜索