/*
int arr[6] = {1,2,4,3,8,5};
从大到小排列:
思路:
1 把最大值放在第一位。首先需要进行双层for循环进行操作;
因为一层只能进行一次操作;
2 采用数组下标计算最大值进行交换的方法。这样其他的数字就不需要变化。
*/
#include <stdio.h>
int arr[6] = {1,2,4,3,8,5};
int main(int argc, const char * argv[]) {
/* //假定一个最大值 每次为数组的第一个元素
int tempMax;
int temp;
for (int i=0; i<5; i++)
{
tempMax = i;
for (int j=i+1;j<6;j++)
{
//arr[tempMax]如果用arr[i]来计算,则当他大于该数时,一直没有变化,因此用tempMax
if (arr[tempMax]<arr[j])
{
tempMax = j;
}
}
//printf("%d-----> tempMax\n",tempMax);
//通过循环找到了最大值的下标则进行交换
temp = arr[i];
arr[i] = arr[tempMax];
arr[tempMax] = temp;
// printf("arr[%d]------%d\n",i,arr[i]);
}
for (int i=0;i<6;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
*/
//冒泡排序算法 两两进行比较;
/*
思路:
小数下沉,双层for循环
第一层控制需要比较的次数
第二层用于比较,大则上升 交换两个数字的位置,每次上升之后则可以少比一次。因为最后一个数字已经下沉了。
*/
/*
int change;
for(int i=0;i<6-1;i++)//n-1次
for(int j=0;j<6-1-i;j++)
{
if(arr[j]< arr[j+1])
{
change = arr[j];
arr[j]= arr[j+1];
arr[j+1] = change;
}
}
for (int i=0;i<6;i++) {
printf("%d\t",arr[i]);
}
printf("\n");
*/
//选择排序 每次都把最大的数字放在第一位
/*
思路:
1 双重循环for 因为每次都只能确认一个,所以需要双重
2 固定首位 用外层for循环arr[i] n-1次 里层循环控制
*/
int temp;
for (int i=0;i<6-1;i++) {
for (int j=i+1/*因为外层已经确定了,所以内存只需要+1*/; j<6; j++) {
if (arr[i]<arr[j]) {
//交换 始终保持arr[i]为最大值;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for (int i=0;i<6;i++) {
printf("%d\t",arr[i]);
}
printf("\n");
return 0;
} |
|