您的位置:首页 > 编程语言 > C语言/C++

C语言的简单应用(五)上

2017-07-17 21:01 162 查看
第五天

今天更新一下期待已久的排序篇,排序算法是数据结构中很火的存在,面试官也超级青睐的地方。

排序(Sorting )是计算机程序设计中的重要操作,排序的基本操作有两种:1、比较两个关键字值的大小 2、根据比较的结果,移动记录的位置。

排序的相关术语

稳定排序与不稳定排序:假定待排序的序列中存在多个记录具有相同的键值,若经过排序,这些记录的相对次序仍然保持不变,则这种排序方法是稳定的;反之,则不稳定。

举个例子:排序前(1,2,3,4,3)排序后(1,2,3,3,4),3的相对次序保持不变,故为稳定排序

内部排序:整个排序过程都在内存进行,不需要访问外部存储器的排序。

外部排序:待排序元素量较大,在排序过程中需对外部存储器进行访问的排序。(暂不讨论外部排序)

1、插入排序:直接插入排序、二分插入排序、希尔排序

直接插入排序(平均时间O(n²),稳定)

#include<stdio.h>
#define max 10
void insert(int a[],int length)
{
int i,j;
for(i=2;i<=length;i++)
{
a[0]=a[i];
j=i-1;
while(a[0]<a[j])
{
a[j+1]=a[j];
j-=1;
}
a[j+1]=a[0];
}
}
int main()
{
int i,length,a[max];
printf("input the length:");
scanf("%d",&length);
for(i=1;i<=length;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
insert(a,length);
puts("the sort order:");
for(i=1;i<=length;i++)
printf("%d ",a[i]);
return 0;

}


二分插入排序(平均时间O(n²),稳定)

#include<stdio.h>
#define max 10
void bininsert(int a[],int length)
{
int i,j,low,mid,high;
for(i=2;i<=length;i++)
{
int x=a[i];
low=1;high=i;
while(low<=high)
{
mid=(low+high)/2;
if(x>a[mid])
low=mid+1;
else high =mid-1;
}
for(j=i-1;j>=low;j--)
a[j+1]=a[j];
a[low]=x;
}
}
int main()
{
int i,j,length,a[max];
printf("input the length:");
scanf("%d",&length);
for(i=1;i<=length;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
bininsert(a,length);
puts("the sort order:");
for(i=1;i<=length;i++)
printf("%d ",a[i]);
return 0;
}


希尔排序(平均时间O(nlgn)~O(n²),不稳定)

#include<stdio.h>
#define max 10
void shellinsert(int a[],int length,int d)
{
int i,j;
for(i=1+d;i<=length;i++)
if(a[i]<a[i-d])
{
a[0]=a[i];
for(j=i-d;j>0&&a[0]<a[j];j-=d)
a[j+d]=a[j];
a[j+d]=a[0];
}
}
void shellsort(int a[],int length,int d[],int n)
{
int i;
for(i=0;i<=n-1;i++)
shellinsert(a,length,d[i]);
}
int main()
{
int i,j,a[max];
int length,d[3]={5,3,1};
printf("input the length:");
scanf("%d",&length);
for(i=1;i<=length;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
shellsort(a,length,d,3);
printf("the shellsort order:");
for(i=1;i<=length;i++)
printf("%d ",a[i]);
return 0;
}


二、交换排序:冒泡排序、快速排序

冒泡排序(平均时间O(n²),稳定)

#include<stdio.h>
#define max 10
void bubblesort(int a[],int len)
{
int i,j,temp,mark;
for(i=1;i<=len-1;i++)
{
mark=1;
for(j=1;j<=len-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
mark=0;
}
if(mark)
break;
}
}
int main()
{
int i,len,a[max];
printf("input the len:");scanf("%d",&len);
for(i=1;i<=len;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
bubblesort(a,len);
puts("the bubblesort order:");
for(i=1;i<=len;i++)
printf("%d ",a[i]);
return 0;
}


快速排序(平均时间O(nlgn),不稳定)

#include<stdio.h>
#define max 10
int quicksort(int a[],int low,int high)
{
int temp=a[low];
while(low<high)
{
while(low<high&&a[high]>=temp)
high--;
if(low<high)
{
a[low]=a[high];
low++;
}
while(low<high&&a[low]<=temp)
low++;
if(low<high)
{
a[high]=a[low];
high--;
}
}
a[low]=temp;
return low;
}
void quick(int a[],int low,int high)
{
int pos;
if(low<high)
{
pos=quicksort(a,low,high);
quick(a,low,pos-1);
quick(a,pos+1,high);
}
}
int main()
{
int i,len,a[max];
printf("input the len:");
scanf("%d",&len);
for(i=1;i<=len;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
quick(a,1,len);
puts("the quicksort order:");
for(i=1;i<=len;i++)
printf("%d ",a[i]);
return 0;
}


未完待续。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: