插入排序
将所需排序的数一个个通过循环找到相应位置插入已排序好的数列中
*时间复杂度:*O(n^2)
#include<stdlib.h>
#include<stdio.h>
int main()
{
int i,j,a,key;
scanf("%d",&a);
int A[100];
for (i=0;i<a;i++)
scanf("%d",&A[i+1]);
for (j=2;j<=a;j++)
{
key=A[j];
i=j-1;
while(i>0&&A[i]>key)
{
A[i+1]=A[i];
i=i-1;
A[i+1]=key;
}
}
return 0;
}
归并排序
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表。
时间复杂度:O(nlog(n))
#include<stdio.h>
#include<math.h>
#include<string.h>
void MERGE(int*A,int left,int mid,int right)
{
int n1=mid-left+1;
int n2=right-mid;
int L[100],R[100];
int i,j,k;
for(i=1;i<=n1;i++)
L[i]=A[left+i-1];
for (j=1;j<=n2;j++)
R[j]=A[mid+j];
L[n1+1]=100000;
R[n2+1]=100000;
i=1;
j=1;
for (k=left;k<=right;k++)
{
if (L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else{
A[k]=R[j];
j++;
}
}
return;
}
void MERGE_SORT(int*A,int left,int right)
{
int mid;
if(left<right)
{mid=(left+right)/2;
MERGE_SORT(A,left,mid);
MERGE_SORT(A,mid+1,right);
MERGE(A,left,mid,right);}
return;
}
int main()
{
int n,i,left,right;
int A[100];
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&A[i]);
}
printf("请输入要排序左右");
scanf("%d%d",&left,&right);
MERGE_SORT(A,left,right);
for(i=1;i<=n;i++)
printf("%d ",A[i]);
return 0;
}