【经典回放】多种语言系列数据结构算法:希尔排序(C/C#版)
? ? ? ? 原理:每隔sp(整數(shù))個(gè)數(shù)即取數(shù)并判斷大小,交換,先構(gòu)造局部有序序列,直到sp為1,構(gòu)造完整的有序序列。
? ? ? ? 給出一組數(shù)據(jù),如下:
?
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 49 | 38 | 65 | 97 | 76 | 13 | 27 | 49 | 55 | 4 |
? ? ? ? 對這個(gè)數(shù)據(jù),將sp設(shè)為5,即先取49,與13比較,進(jìn)行交換;再取38,與27對比,進(jìn)行交換,以此內(nèi)推。終止條件是76與4對比完。至此,我們可以寫出如下希爾函數(shù)的核心部分:
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;
????????????? }
??? 當(dāng)然,這僅僅是走完了排序的第一趟!要完成真正的排序,還要進(jìn)行循環(huán)!
一、C語言版
1、希爾函數(shù)
void ssort(int a[],int n,int sp) //n為數(shù)據(jù)大小,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])//如果前面你的大于后面的,則進(jìn)行交換
????????????? {
???????????????????? t=a[j];a[j]=a[j+sp];a[j+sp]=t;
????????????? }
}
? ? ? ? 我們知道,希爾排序一趟是排不出最終結(jié)果的,sp要從大到小,最后取到1才能完成,于是在主調(diào)函數(shù)里要調(diào)用多次ssort函數(shù)(如下面main函數(shù)里的標(biāo)紅部分),于是我們將多個(gè)sp綜合到一個(gè)數(shù)組里,再將這個(gè)數(shù)組套入循環(huán),即可得到一個(gè)新的函數(shù),這樣在主函數(shù)里就可以直接調(diào)用該函數(shù)了,如下:
void shellsort(int a[],int n,int d[],int dn) //dn為sp的個(gè)數(shù)
{
?????? int i;
?????? for(i=0;i<dn;i++)
????????????? ssort(a,n,d[i]);
}
2、main函數(shù)
main()
{
?????? inta[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);//一次調(diào)用多個(gè)循環(huán)
?????? for(j=0;j<10;j++)
????????????? printf("%d? ",a[j]); //打印最后排序結(jié)果
?????? printf("%d\n");
}
3. 結(jié)果顯示
二、C#版
1. 構(gòu)造算法類
?
class XiEr {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]);} }2. 前端調(diào)用
?
?
private void button1_Click(object sender, EventArgs e){int j;int[] a = { 49, 38, 100, 97, 76, 13, 27, 49, 55, 4 };int[] d = { 5, 3, 1 };XiEr xier = new XiEr();xier.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);}3. 結(jié)果顯示
?
?
總結(jié)
以上是生活随笔為你收集整理的【经典回放】多种语言系列数据结构算法:希尔排序(C/C#版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArcGIS怎样获取重分类后各类所占的像
- 下一篇: C#金额小写转大写