冒泡排序、选择排序和插入排序都是一些效率比较低的排序算法,对于有大量数据的排序,Shell排序算法算是一种有效率的算法。
Shell排序法中最后一步是插入排序,又称为希尔排序或者缩小增量排序。
算法流程:
1、将有n个元素的数组分成n/2个序列,第一个数字与第n/2+1个数字配对,作为一个序列对,后面的数字也一样进行配对,形成序列对;
2、循环一次将所有的序列对进行比较,该交换的进行交换,排好序;
3、然后分成n/4个序列,按上面的一样进行排序;
4、不断重复上面的过程,直到只有一个序列对时,进行插入排序点击打开链接;
假设有N个数据:
1 3 5 4 2
第一步:1和4,3和2形成序列对,进行比较,排序;
1 2 5 4 3
第二步:因为N/4=1,所以进行插入排序;
【核心代码】
void ShellSort(int *a,int len)
{
int i, j, h;
int r, temp;
int x = 0;
for (r=len/2;r>=1;r/=2)//r>=1保证至少有两个可以比较的数,r/=2确定序列对
{
for (i=r;i<len;i++)//插入排序算法
{
temp = a[i];
j = i - r;
while (j>=0&&temp<a[j])//对配对的两个数进行比较
{
a[j + r] = a[j];
j -= r;
}
a[j + r] = temp;
}
x++;
printf("第%d步的排序结果:",x);
for (h=0;h<len;h++)
{
printf("%d ",a[h]);
}
printf("\n");
}
}
【代码示例】
// c++算法之shell排序算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
void ShellSort(int *a,int len)
{
int i, j, h;
int r, temp;
int x = 0;
for (r=len/2;r>=1;r/=2)//r>=1保证至少有两个可以比较的数,r/=2确定序列对
{
for (i=r;i<len;i++)
{
temp = a[i];
j = i - r;
while (j>=0&&temp<a[j])//对配对的两个数进行比较
{
a[j + r] = a[j];
j -= r;
}
a[j + r] = temp;
}
x++;
printf("第%d步的排序结果:",x);
for (h=0;h<len;h++)
{
printf("%d ",a[h]);
}
printf("\n");
}
}
int main()
{
using namespace std;
int i;
int SIZE;
cout << "请输入待排序的数字的个数:";
cin >> SIZE;
int *arr = new int[SIZE];
srand(time(NULL));
for (i=0;i<SIZE;i++)
{
arr[i] = rand() / 1000;
}
printf("排序前:\n");
for (i=0;i<SIZE;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
ShellSort(arr,SIZE);
printf("排序后:\n");
for (i=0;i<SIZE;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
system("pause");
return 0;
}
【演示结果】