MOOC第七章中排序部分的归纳
将无序的数组按照大小顺序有序排列叫做排序。
每次需要选出最大值的思路方法叫做选择排序,大致思路如下:
- 长度为len的数组(最大下标为len-1),先找出数组中最大值对应的位置maxid;
- 然后将a[maxid]与a[len-1]的值做交换,即将最大值固定在数组最末尾位置;
- 此时的数组长度减1,即获得前(len-1)大小的数组重复进行①②直至数组长度len为1(最大下
- 标为0)
#include<stdio.h>
//返回数组中最大值所在位置,a为数组,len为数组a的大小
int max(int a[], int len)
{
int ret = 0;
int i;
for( i=1 ; i<len ; i++){
if( a[i]>a[ret] ){
ret = i;
}
}
return ret;
}
int main()
{
int a[] = {5,3,8,2,99,56,4,3,15,68,1,7};
int len = sizeof(a)/sizeof(a[0]);
int i;
// 选择排序
for( i=len-1 ; i>0 ; i--){ // 循环过程中最大值固定在最后一个元素后,待排序的数组元素每次循环减1
int maxid = max(a, i+1); // 找到最大值位置
// 最大值与数组最末尾的元素进行交换
int t = a[maxid];
a[maxid] = a[i];
a[i] = t;
}
// 输出
for( i=0 ; i<len ; i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
如果不将获得最大值所在位置单独写成函数而直接放在主函数中,则有:
#include<stdio.h>
// 在主函数中实现全部功能
int main()
{
int a[] = {5,3,8,2,56,4,3,15,68,1};
int len = sizeof(a)/sizeof(a[0]); // 数组长度
int i;
// 选择排序
for( i=len-1 ; i>0 ; i--){ // 循环过程中最大值固定在最后一个元素后,待排序的数组元素每次循环减1
// 找到最大值位置
int maxid = 0;
int j;
for( j=1 ; j<i+1 ; j++){
if( a[j]>a[maxid] ){
maxid = j;
}
}
// 最大值与数组最末尾的元素进行交换
int t = a[maxid];
a[maxid] = a[i];
a[i] = t;
}
// 输出
for( i=0 ; i<len ; i++){
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
95

被折叠的 条评论
为什么被折叠?



