插入排序之希尔排序
一、算法思想
希尔排序的思想
1、按照如下规则选取排序增量。
d(i) < n;
d(i+1) < d(i);
d(i)是一个整数;
2、把所有元素划分成d(i)组(各组元素之间的距离是d(i))
3、对于每一组进行直接插入排序。重复上述过程,直到d(i)=1做完为止。
在希尔排序中使用直接插入排序
在希尔排序中使用直接插入排序,直接插入排序其实就是将元素分为增量为1的一组(即start=1, increment=0)。所以我们在使用希尔排序的时候直接将我们的start和increment放到其中就可以了。
二、动态演示
http://jw1.nwnu.edu.cn/jpkc/2006/sjjg/1%20动态演示–dynamic%20demonstration/7/7.1.3.swf
三、代码实现
sortable_list.cpp
/*sortable_list.cpp*/
#include <iostream>
using namespace std;
const int maxstack = 10;
template <class Record>
class sortable_list
{
public:
int count;
Record entry[maxstack];
public:
sortable_list(int n);
void sort_interval(int start, int inc);
void shell_sort();
};
template <class Record>
sortable_list<Record>::sortable_list(int n)
{
sortable_list::count = n;
}
template <class Record>
//void sortable_list<Record>::sort_interval(1, 0)----Direct insertion sort
void sortable_list<Record>::sort_interval(int start, int inc)
{
int n = count;
int i, j;
for(i = start+inc; i < n; i+=inc)
{
j = i-inc;
if(entry[i] < entry[i-inc])
{
int current = entry[i];
while(current < entry[j] && j >= 0){
entry[j+inc] = entry[j];
j-=inc;
}
entry[j+inc] = current;
}
}
}
template <class Record>
void sortable_list<Record>::shell_sort()
{
int increment, start;
increment = count;
do{
increment = increment / 3 + 1;
for(start=0; start<increment; start++)
sort_interval(start, increment);
}while(increment>1);
}
test.cpp
#include <iostream>
#include "sorted_list.cpp"
using namespace std;
int main()
{
int unsorted_list[10] = {1,5,2,12,0,15,23,9,123,10};
sortable_list<int> sort(10);
for(int i = 0; i < 10; i++)
{
sort.entry[i] = unsorted_list[i];
}
sort.shell_sort();
for(int i = 0; i < 10; i++)
{
cout<<sort.entry[i]<<" ";
}
return 0;
}
四、结果
五、算法分析
时间复杂度:O(n^1.25)
空间复杂度:O(1)