排序算法:冒泡排序,选择排序,插入排序
冒泡排序:
冒泡排序是一种基于交换的排序,其基本思想是将相邻元素进行两两比较,如果两者反序,则进行交换,直到没有反序为止。
*例:*将1,3,4,2,5进行排序
第一趟:
-
比较1和3,不交换位置;1,3,4,2,5
-
比较3和4,不交换位置;1,3,4,2,5
-
比较4和2,交换位置; 1,3,2,4,5
-
比较4和5,不交换位置;1,3,2,4,5
-
此时确定最大数5的位置
第二趟:
-
比较1和3,不交换位置;1,3,2,4,5
-
比较3和2,交换位置; 1,2,3,4,5
-
比较3和4,不交换位置;1,2,3,4,5
此时确定倒数第一位5与倒数第二位4的位置,以此类推,每一趟确定一个位置,直到所有数确定位置。
由此可见,对N个数进行排序,需要进行N-1趟比较,第i趟的两两比较次数为N-i次。可以使用二重循环语句,外层循环N-1次,内层循环N-i次。
#define NUM 10//可改变输入数据的个数
int main()
{
int arr[NUM],i,j,temp;
printf("输入%d个数字:\n",NUM)
for(i=0;i<NUM;i++)
scanf("%d",&arr[il);
for(i=0;i<NUM-1;i++)
{
//外层循环控制排序趟数//
for(j=0;j<NUM-1-i;j++)
{
//内层循环控制每一趟排序多少次//
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
printf("after sort:\n");
for(i=0; i<NUM; i++)
printf("%d",arr[i]);
return 0;
}
选择排序:
通过一个中间量从待排序的数中找出最大或最小的交换到对应位置。
*例:*将1,6,3,5,8进行排序
-
1,6,8,5,3; 1与其他数比较,1最小,位置不变
-
1,3,8,5,6; 6与其他数比较,3最小,6和3交换位置
-
1,3,5,8,6;8与其他数比较,5最小,8和5交换位置
以此类推,直到确定所有数序。
- 取第一个元素的值(设共n个元素),遍历n-1次,用该值与其他元素比较,找到最大或最小的一个数交换。
- 取第二个元素的值,遍历n-1次,用该值与剩下其他元素比较,找到最大或最小的一个数交换。
- 重复上诉步骤,遍历n次,直到没有要比较的数。
int main()
{
int i,j,index,n,t,a[100];
printf("输入数字总数:");
scanf("%d",&n);//输入几个数的排序
printf("输入数字:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);//输入数字
for(i=0;i<n-1;i++)
{
index=i;//标记最小数的下标
for(j=i+1;j<n;j++)
{
if(a[index]<a[j]) index=j;
if(index>i)//交换两个位置上的数字
t=a[index],a[index]=a[i],a[i]=t;
}
}
for(i=0;i<n;i++)
printf("%4d",a[i]);//排序后依次输出
return 0;
}
插入排序:
将一个数组分为有序列以及无序列,无序列插入到有序列中。设a[0]为已经排好序的子序列,然后将剩下无序列元素一个一个插入到有序的子序列中。
*例:*将4,3,5,6,2进行排序
- 确定4是有序的,3小于4则插入到4的前面;3,4,5,6,2
- 5大于4的同时也大于3,插入4的后面;3,4,5,6,2
- 6大于5的同时也大于4,插入5的后面;3,4,5,6,2
- 2小于3则插入3的前面;2,3,4,5,6
得到有序序列:2,3,4,5,6
#define NUM 5
void f(int a[])
{
int i,j,temp;
for(i=0;i<NUM;i++)
{
temp=a[i];
if(a[i]<a[i-1])//当前数小于前一位数时
{//将子序列重新排列为有序序列
for(j=i-1;temp<a[j];j--)
{
a[j+1]=a[j];
}
a[j+1]=temp;
}
}
}
int main()
{
int a[]={4,3,5,6,2}; //输入待排序数组
int i;
printf("未排序前:\n");
for(i=0;i<NUM;i++)
{
printf("%d", a[i]);
}
printf("\n经过插入排序后:\n");
f(a);
for(i=0;i<NUM;i++)
{
printf("%d", a[i]);
}
}