/选择排序法对数组中的n个数,由小到大排序
#include<stdio.h>
main()
{
int n=10,i,b,a[10];
int sort(int array[],int n);
// scanf("%d",&10);
for(i=0;i<10;i++)//键盘输入数组元素
scanf("%d",&a[i]);
sort(a,10);//调用函数
for(i=0;i<10;i++)//输出排序之后的函数
printf("%3d",a[i]);
}
//排序子函数错误!!!!这是冒泡的思想!!!
//int sort(int array[],int n)//排序子函数
{
int i,j,k,t;
for(i=0;i<n-1;i++)//需要比较n-1次
{
//k=i;
for(j=i+1;j<n;j++)//第i次比较,与第i+1个数开始比较
{
if(array[j]<array[i])
{
t=array[i];
array[i]=array[j];
array[j]=t;
}
}
}
}
//下面是正确的子函数
int sort(int array[],int n)//排序函数
{
int i,j,k,t;
for(i=0;i<n-1;i++)//需要比较n-1次
{
k=i;
for(j=i+1;j<n;j++)//第i次比较,与第i+1个数开始比较
if(array[j]<array[k])
k=j;//for(j)函数到这里结束了!!!!
t=array[i];
array[i]=array[k];
array[k]=t;
}
}
//冒泡排序法对数组中的n个数,由小到大排序 #include<stdio.h> main() { int sort(int array[],int n); int n=10,i,j,k,a[10]; printf("请输入10个数:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); sort (a,10); printf("输出排序后的10个数:\n"); for(i=0;i<10;i++) printf("%2d",a[i]); } int sort(int array[],int n) { int i,j,k; for (j=0;j<9;j++) { for(i=0;i<9-j;i++) { if(array[i]>array[i+1]) { k=array[i]; array[i]=array[i+1]; array[i+1]=k; } } } }
选择法:
假定a[0]为最值,先将10个数中最小的数与a[0]对换,(只有这俩对换,其余位置不变!!!)再将a[1]~a[9]中最小的数与a[1]对换......每比较一轮,找出未经排序的最小的数。以5个数为例子说明:
a[0] a[1] a[2] a[3] a[4]
2 5 0 8 3
[0] 5 [2] 8 3 将5个数中最小的与a[0]对换
0 [2] [5] 8 3 将余下的4个数中最小的与a[1]对换
0 2 [3] 8 [5] 将余下的3个数中最小的与a[2]对换
0 2 3 [5] [8] 将余下的2个数中最小的与a[3]对换
完成排序
选择排序法的复杂度:O(n*n)
冒泡排序法:
临近数字两两依次比较,按从小到大或从大到小顺序交换,一趟过去之后,最大或最小的数字被交换到了最后一位。再从头开始比较,直到倒数第二位。
以5个数为例子说明:
a[0] a[1] a[2] a[3] a[4]
2 5 0 8 3
第一趟:第一次两两比较: 2 0 5 8 3
第一次两两比较: 2 0 5 3 [ 8 ]
第二趟: 0 2 3 [ 5 8 ]
第三趟: 0 2 [ 3 5 8 ]
第四趟: 0 [ 2 3 5 8 ]
完成排序。
冒泡排序法的复杂度:O(n*n)。
两者都是效率比较低的排序方法。
我最开始把选择和冒泡搞混了,选择的思想在于每次只有最值和第i个数对换,其余都保持原位不变!!!所以子函数里面,for循环里面的小for循环,只是把j赋给k,继续小for循环 ,不交换a[j]和a[k]的值。到外面的大for循环再交换a[j]和a[k]的值,这样就实现了选择排序。
来源:https://www.cnblogs.com/sunmarvell/p/5944092.html