写个希尔排序算法的程序写了一个半小时,也是醉了,看样子对代码的 熟悉程度确实是还很差很差啊,废话不说了,总结如下:
希尔排序,感觉就是优化了的插入排序,先对待排序的数组进行分组,再排序。然后再组合起来,减小分组的间隙,再排序,再组合。其实我也不是很清楚,具体如何优于插入排序法,这个需要再认真发分析一下时间复杂度。在学完所有排序方法后进行总结。先把实现的思想和代码贴上来,代码有较详细的注释,图片来自百度百科
实现代码如下:
#include "stdafx.h"
#include<iostream>
#include<iomanip>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <list>
using namespace std;
void shell_sort(int a[], int arraylength, int n);
int main()
{
int aa[] = { 70, 30, 40, 10, 80, 20, 90, 100, 75, 60, 45 };
int n;
cout<< "请输入排序的初始增量";
cin >> n;
for (int i = n; i > 0; i--)//由用户设置初始量,依次递减,直到等于1
{
shell_sort(aa, sizeof(aa) / sizeof(int), i);
}
int size_aa = sizeof(aa) / sizeof(int);
for (int i = 0; i < size_aa; i++)
{
cout << aa[i] << endl;
}
return 0;
}
void shell_sort(int a[], int arraylength, int n)//arraylength是数组的长度,传参数时,要顺便把这个也传过来,否则C++会只传数组的首地址,并不关系数据具体的大小
{
int size_a = arraylength;
for (int i = n; i < size_a; i = i + n)//外层循环,根据n控制跳跃程度
{
for (int y = 0; y < n; y++)//内层循环,控制每个组元素的跳跃获取,并用插入排序法进行排序的
{
int j = i + y;//图中的例子是n=3的情况
if (j < size_a)//特别注意判断一下,免得数组越界啊
{
int key = a[j];
int m = j - n;
while ((m >= 0) && (key <= a[m]))
{
a[m + n] = a[m];
m = m - n;
}
a[m + n] = key;
}
}
}
}
其实,初学者刚开始看这个代码,可能逻辑还是有点混乱的,我写的时候,并不是一气呵成的(所以也耽误时间了嘛),我先规定了初始量为3,按照3的标准写了如下代码,然后再用循环进行了修改,最后得到了上面的最终版本。
void shell_sort(int a[], int arraylength, int n)//该函数中n=3了
{
int size_a = arraylength;
for (int i = 3; i < size_a; i = i + 3)//外层循环,根据n控制跳跃程度
{
int j = i + 1;
int key2 = a[j];
int n = j - 3;
while ((n >= 0) && (key2 <= a[n]))
{
a[n + 3] = a[n];
n = n - 3;
}
a[n + 3] = key2;
int key = a[i];
int m = i - 3;
while ((m >= 0) && (key <= a[m]))
{
a[m + 3] = a[m];
m = m - 3;
}
a[m + 3] = key;
int k = i + 2;
if (k < size_a)
{
int key3 = a[k];
int p = k - 3;
while ((p >= 0) && (key3 <= a[p]))
{
a[p + 3] = a[p];
p = p - 3;
}
a[p + 3] = key3;
}
}
}