经常练练,有易于身心健康,避免出没遇到熊。
1 请编写函数fun,对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按ASCII码降序排列。
例如,若原来的字符串为CEAedca,则排序后输出为CedcEAa。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
void fun( char *s,int num)
方式一 错误1:
c = *p_start;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 5 - i - 1; j++)
{
if (*(p_start + j) < *(p_start + j + 1))
{
c = *(p_start + j + 1);
*(p_start + j + 1) = *(p_start + j);
*(p_start + j) = c;
}
}
}
方式二 错误1:
c = *p_start;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 5 - i - 1; j++)
{
if (c < *(p_start + j + 1))
{
*(p_start + j) = *(p_start + j + 1) ;
*(p_start + j + 1) =c;
} else
c = *(p_start + j + 1);//c 保持为最小
}
}
方式二 正确1:
c = *p_start;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 5 - i - 1; j++)
{
if (c < *(p_start + j + 1))//我这种冒泡是把小的泡泡冒出去,标准的是把小的保持不动。
{
c = *(p_start + j + 1);
*(p_start + j + 1) = *(p_start + j);
*(p_start + j) = c;
}
c = *(p_start + j + 1);
}
}
方式二正确2:其实我觉得这个更像冒泡,这边是把最小的推到最右边,标准冒泡是每个人来跟自己比,并把最大的留下,不形象。
for (i = 0; i < 4; i++)
{
c = *p_start;
for (j = 0; j < 5 - i - 1; j++)
{
if (c < *(p_start + j + 1))
{
*(p_start + j) = *(p_start + j + 1) ;
*(p_start + j + 1) = c;
} else
c = *(p_start + j + 1);
}
}
}
标准冒泡:
void fun2( char *s,int num)
{
char temp;
int i, j;
char *arr = s + 1;
for (i = 0; i < 5 - 1; i++)
{
for (j = i + 1; j < 5; j++)
{
if (arr[i] < arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf("After sorting, the strings is : %s\n", s);
}
选择排序:
思想:n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
插入排序:
正确插入:
void fun444( char *s,int num)
{
char temp;
int i = 0, j, k = 0;
char *arr = s + 1;
//这个不是最优化
for (i = 0; i < 5 - 1; i++)
{
for (j = i + 1; j > 0; j--) //在这边将要循环到0, 这个是浪费。
{
if (arr[j - 1] < arr[j])
{
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
//这个是标准的:
for
(i = 1; i < 5; i++)//这样写的确比较好记,如果写成 i < 5 -1, 这样没有基点 思维会比较乱
{
temp = *(arr + i);
for
(j = i; j > 0 && *(array + j - 1) > temp; j--)//中间的条件使得该循环更早退出
{
*(array + j) = *(array + j - 1);
}
*(array + j) = temp;
}
插入排序错误代码:
void fun4( char *s,int num)
{
char temp;
int i = 0, j, k = 0;
char *arr = s + 1;
for (i = 0; i < 5 - 1; i++)
{
for (j = i + 1; j > 0; j--)
{
if (arr[j - 1] > arr[i + 1])
{
k = j - 1 ;
break;
}
}
if (k < i && k == 0)
{
temp = arr[i+1];
for(k = i ; k > 0; k--)
{
arr[k + 1] = arr[k];
}
arr[k] = temp;
}
else if (k < i && k > 0 )
{
temp = arr[i+1];
for(j = i ; j > k; j--)
{
arr[j + 1] = arr[j];
}
arr[j] = temp;
}
}
}
===================
main()
{
char s[10];
printf(“输入7个字符的字符串:”);
gets(s);
fun(s,7);
printf(“\n%s”, s);
}