Shell排序法(十二)

冒泡排序、选择排序和插入排序都是一些效率比较低的排序算法,对于有大量数据的排序,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;
}
【演示结果】





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值