【经典回放】多种语言系列数据结构算法:希尔排序

【希尔排序原理】每隔sp(整数)个数即取数并判断大小,交换,先构造局部有序序列,直到sp1,构造完整的有序序列。

给出一组数据,如下:

0

1

2

3

4

5

6

7

8

9

49

38

65

97

76

13

27

49

55

4

对这个数据,将sp设为5,即先取49,与13比较,进行交换;再取38,与27对比,进行交换,以此内推。终止条件是764对比完。至此,我们可以写出如下希尔函数的核心部分:

for(i=0;i<n-sp;i++)
   for(j=i;j<n-sp;j+=sp)
          if(a[j]>a[j+sp])
          {
                 t=a[j];a[j]=a[j+sp];a[j+sp]=t;
          }

    当然,这仅仅是走完了排序的第一趟!要完成真正的排序,还要进行循环!

1. C语言

#include<stdio.h>
/*
main()
{
	int i,j,t,a[]={49,38,65,97,76,13,27,49,55,4},n=10,sp=5;
	for(i=0;i<n-sp;i++)
	for(j=i;j<n-sp;j+=sp)
		if(a[j]>a[j+sp])
		{
			t=a[j];a[j]=a[j+sp];a[j+sp]=t;
		}
		for(j=0;j<n;j++)
			printf("%4d",a[j]);
		printf("%d\n");
}
*/
void ssort(int a[],int n,int sp)
{
	int i,j,t;
	for(i=0;i<n-sp;i++)
	for(j=i;j<n-sp;j+=sp)
		if(a[j]>a[j+sp])
		{
			t=a[j];a[j]=a[j+sp];a[j+sp]=t;
		}
}

void shellsort(int a[],int n,int d[],int dn)
{
	int i;
	for(i=0;i<dn;i++)
		ssort(a,n,d[i]);
}

main()
{
	int a[10]={49,38,65,97,76,13,27,49,55,4},j;
	int d[]={5,3,1};
	//ssort(a,10,5);
	//ssort(a,10,3);
	//ssort(a,10,1);
	shellsort(a,10,d,3);
	for(j=0;j<10;j++)
		printf("%d  ",a[j]);
	printf("%d\n");
}

2. C#语言

C#希尔排序界面设计
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 希尔排序
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void ssort(int[] a, int n, int sp)
        {
            int i, j, t;
            for (i = 0; i < n - sp; i++)
                for (j = i; j < n - sp; j += sp)
                    if (a[j] > a[j + sp])
                    {
                        t = a[j]; a[j] = a[j + sp]; a[j + sp] = t;
                    }
        }

        public void shellsort(int[] a, int n, int[] d, int dn)
        {
            int i;
            for (i = 0; i < dn; i++)
                ssort(a, n, d[i]);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int j;
            int []a={49,38,65,97,76,13,27,49,55,4};
            int []d={5,3,1};
            shellsort(a,10,d,3);
            listBox1.Items.Clear();
            string tt = "";
            for (j = 0; j < 10; j++)
                tt = tt + a[j].ToString() + '\t';
                listBox1.Items.Add(tt);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
发布了331 篇原创文章 · 获赞 340 · 访问量 175万+

猜你喜欢

转载自blog.csdn.net/lucky51222/article/details/104393091
今日推荐