排序演算法之直接插入排序和希爾排序
阿新 • • 發佈:2018-12-23
相信許多人和我一樣,排序演算法看了好幾遍,當時看懂了,過幾天一些細節又忘記,所以現在講排序演算法做一個總結,從最基本的排序演算法展開來,首先分析直接插入排序和希爾排序。
1.直接插入排序
思想:把一個數插入到已經排序的有序序列中;
方法:將這個數與有序序列自右向左比較,若該數較小,則往左移,等價於序列中較大值向右移動。
實現:(在VC6.0下執行通過)
#include<stdio.h>
void sort(int s[],int n)//從小到大排序
{
int i,j,a;
for(i=1;i<=n;i++)
{
a=s[i];//a做臨時變數,儲存比較的值,防止陣列右移將其覆蓋
j=i-1;
while(a<s[j])//此數比序列中最後一個數小,則將最後一個數右移一位,與序列中倒數第二個數比較,以此類推
{
s[j+1]=s[j];
j--;
}
s[j+1]=a;
}
}
print(int a[],int n)//列印陣列元素
{
int i;
for(i=0;i<n;i++)
{
printf("%d",a[i]);
}
printf("\n");
}
void main()
{
int a[5]={5,8,4,3,9};
print(a,5);
sort(a,5);
print(a,5);
}
2.希爾排序
思想:希爾排序是直接插入排序的改進
方法:將序列分為若組,分組不是逐段分的,而是設定一個增量d,距離為d的倍數為一組,再將d=d/2進行分組,直至d=1,最後使用直接插入排序演算法進行排序。
分析:陣列a[10]={5,8,4,3,9,6,1,7,2,10}
5 8 4 3 9 6 1 7 2 10
第一趟:n=10,d=n/2=5
5 - - - - 6
8 - - - - 1
4 - - - - 7
3 - - - - 2
9 - - - -10
得到:5 1 4 2 9 6 8 7 3 10
第二趟:d=d/2=2
5 - 4 - 9 - 8 - 3
1 - 2 - 6 - 7 - 10
得到:3 1 4 2 5 6 8 7 9 10
第三趟:d=d/2=1
得到:1 2 3 4 5 6 7 8 9 10
實現:
#include<stdio.h>
void xier_sort(int a[],int n)//從小到大排序
{
int d;
int i,j,b;
d=n/2;
while(d>=1)//增量小於1時終止
{
for(i=d;i<n;i++)
{
b=a[i];
j=i-d;
while(b<a[j])
{
a[j+d]=a[j];
j=j-d;
}
a[j+d]=b;
}
d=d/2;
}
}
void print(int a[],int n)
{
int m=0;
while(m<n)
{
printf("%d ",a[m]);
m++;
}
printf("\n");
}
void main()
{
int a[10]={5,8,4,3,9,6,1,7,2,10};
print(a,10);
xier_sort(a,10);
print(a,10);
}