直接插入排序
排序思想:
每步将一个待排序的对象,按其关键字大小,插入到前面已经有序的一组对象的适当位置上,直到剩余对象全部插入为止。
#include <stdio.h>
#define Max 20
int main(){
int a[Max];
int n,k,j,i;
printf("请输入要排序的数的个数:");
scanf("%d",&n);
printf("请输入要排序的数:\n");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<n;i++){
k=a[i];
for(j=i-1;j>=0&&k<a[j];j--){
a[j+1]=a[j];//依次后移
}
a[j+1]=k;
}
printf("排序后的数为:\n");
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
希尔排序
排序思想:
先将整个待排记录序列分割成若干子序列(按照每一趟的增量dk),分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。增量dk逐趟缩短(例如依次取dk =5,3,1)
#include <stdio.h>
#define Max 20
void ShellInsert(int a[],int dk,int n){
int i,j;
for(i=dk+1;i<=n;i++){
if(a[i]<a[i-dk]){
a[0]=a[i];
for(j=i-dk;j>0&&a[0]<a[j];j-=dk)
a[j+dk]=a[j];
a[j+dk]=a[0];
}
}
}
void ShellSort(int a[],int d[],int dk,int n){
int k;
for(k=0;k<dk;k++)
ShellInsert(a,d[k],n);
}
int main(){
int a[Max],d[Max];
int n,k,j,i,dk;
printf("请输入要排序的数的个数:");
scanf("%d",&n);
printf("请输入要排序的数:\n");
a[0]=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
printf("请输入要划分的子序列次数:");
scanf("%d",&dk);
printf("请输入每次的子序列大小:");
for(i=0;i<dk;i++)
{
scanf("%d",&d[i]);
}
ShellSort(a,d,dk,n);
printf("排序后的数为:\n");
for(i=1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}
堆排序
排序算法:
先构建一棵大顶堆,输出堆顶元素,将最后一个节点放到堆顶,重新调整为大顶堆,再输出堆顶元素。重复上述步骤直至完毕。
#include <stdio.h>
#define Max 20
int HeapAdjust (int a[],int s,int m){
int rc,j,temp;
rc=a[s];
for(j=2*s;j<=m;j*=2){
if(j<m&&(a[j]<a[j+1]))
j++;
if(!(rc<a[j]))
break;
temp=a[j];
a[j]=a[s];
a[s]=temp;
s=j;
}
}
void HeapSort(int a[],int n){
int i;
for(i=n/2;i>0;i--){
HeapAdjust(a,i,n);
}
for(i=n;i>1;i--){
printf("%d ",a[1]);
a[1]=a[i];
HeapAdjust(a,1,i-1);
}
}
int main(){
int a[Max];
int n,k,j,i;
printf("请输入要排序的数的个数:");
scanf("%d",&n);
printf("请输入要排序的数:\n");
a[0]=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
printf("排序后的数为:\n");
HeapSort(a,n);
return 0;
}