常见的三种排序算法:冒泡排序,选择排序,插入排序
- 冒泡排序(稳定):
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
//两两比较
int main()
{
int i,j;
int temp;
int buf[N]={78,78,56,78,89};
for(i=0; i<N-1; i++) //决定里面的循环循环几轮
{
for(j=0; j<N-1-i; j++)
{
if(buf[j]>buf[j+1]) //前面的数大于后面的数,交换位置
{
temp=buf[j];
buf[j]=buf[j+1];
buf[j+1]=temp;
}
}
}
//打印结果
for(i=0; i<N; i++)
printf("%d ",buf[i]);
printf("\n");
}
- 选择排序:
选择排序是简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,但这种算法不稳定,例如遇到连个值相同元素时,第一个元素可能会移到第二个后面。
int main()
{
int a[5] = {5,9,23,14,16};
int n = 5;
int i,j,k;
int tmp;
for (i=0;i<n-1;i++)
{
k = i;
for (j=i+1 ;j<=n ;j++)
{
if(a[j]<a[i])
{
k = j;
}
if(i != k)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
for(i=0; i<5; i++)
printf("%d ",a[i]);
printf("\n");
}
- 直接插入排序:
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
//[1] 3 7 8 5
//[1 3] 7 8 5
//.....
//[1 3 7 8] 5
//[1 3 5 7 8]
int main()
{
int a[5] = {1,3,7,8,5};
int tmp;
int n = 5;
int j,i;
for(i=1; i<n; i++)
{
tmp = a[i]; //即将插入有序列表的元素
for(j=i-1; j>=0; j--)
{
if(a[j] < tmp)
{
break;
}
else
{
a[j+1] = a[j];
}
}
a[j+1] = tmp;
}
//打印结果
for( i=0; i<n; i++)
printf("%d ",a[i]);
}
以上三种算法时间复杂度均为:O(n^2)。