插入排序時需要移動大量元素。為此可用乙個輔助的迴圈陣列來減少元素的移動次數。具體做法如下,對於乙個待排序的陣列a,我們首先找到乙個與a相同大小的迴圈陣列。然後按照以下操作進行。
1.令b[0]=a[0]。因為乙個元素總是有序的。
2.令兩個指標first和final指向b中已存在元素的最大和最小值。
3.對於從a[1]開始的元素,我們從b中尋找其正確的插入位置。這時會出現三種情況。如果a[i]小於b[first]時,我們把first指標向前移動一位,然後令first所指元素的值為a[i]。反之如果a[i]>b[final],我們把final指標向後移動一位。如果不是以上兩種情況,我們就在first和final構成的「環形」中,尋找a[i]的正確插入位置。
可以看到,這會出現兩種極端情況。第一種是,每次掃瞄都會遇到乙個最大值或者最小值,這種情況下不需要進行任何的移動元素操作,每一步都直接修改指標即可。另一種情況是每次掃瞄都遇不到最大值和最小值,這時就需要在first和final構成的「環形」中進行常規的插入操作,二路插入排序退化成普通的插入排序。
**如下:
參考了的**,做了一些修改。
// 2-wayinsertsort.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include using namespace std;
void print(const std::deque& l)
std::cout << std::endl;
}void insertsort(std::deque& l)
else
for (int j = end; j >= high + 1; --j)
d[(high + temp + 1) % n] = l[i];
final = (final + 1 + n) % n;
print(d);
} }//複製陣列
折半 二路插入排序
折半插入排序 直接插入排序是將待插入元素與前面的元素一一比較,尋找合適的位置插入。而折半插入是通過折半來查詢位置,所謂折半 可以參考二分查詢 就是定義兩個變數分別指向頭start和尾end,取其中間值mid。如果待插入元素大於mid位置上的元素就這mid和end之間再查詢,如果小於,則在start和...
插入排序 直接,折半,二路,希爾
插入排序 給出一下四種方法 直接插入排序,折半插入排序,二路插入排序,希爾插入排序 實現 cpp view plain copy print?include using namespace std define size 21 typedef intsqlist size void sinserts...
2路插入排序
基本思想 以第乙個記錄為界,將整個記錄序列分成兩部分進行處理。將不小於第乙個記錄的所有記錄用折半插入的方式插入左路的序列序列中,將小於第乙個序列的記錄插入用折半插入的方法插入到右路的序列中。final為左路最後乙個元素,first為右路第乙個元素。空間複雜度o n 時間複雜度o n 2 這是穩定的排...