c语言冒泡排序:部分排序
题目
对于一组数据,我们可以只对原先处在中间位置的那些元素进行排序。
输入格式
在一行内输入n r a1 a2 ... an
其中,不大于200的正整数n
表示该组数据的个数;不大于200的非负整数r
表示该组数据两端各自留有r
个数不参与排序,若r+r>=n
,则该组数据无需排序。
输出格式
排序之后的序列,元素之间用一个空格间隔,最后一个元素之后不加空格。
输入样例:
5 1 6 5 4 3 2
输出样例:
6 3 4 5 2
核心代码
for (int i = 1; i <= n - 2 * r - 1; i++)
// 第一层for循环表示外层比较轮数,比如10个数字就需要比较9轮,最后一个数字就自然有序了。因为是看两者是否逆序,逆序就两两交换
{
for (int j = 1 + r; j <= n - r - i; j++)
// 这层for循环表示每轮下标为j的元素要比较多少次(也就是冒泡多少次),比如总共有十个数字需要比较,那么第一个数字要和后面九个数字比较共有比较9次,最后 一个数字(j=9,数组起始下标为0)就确定了。下次就只是需要比较到j=8,
{
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
完整代码
#include <stdio.h>
int main()
{
int n;
int r;
scanf("%d %d", &n, &r);
int a[100000];
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
if (r + r >= n)
{
goto lable;
}
for (int i = 1; i <= n - 2 * r - 1; i++)
{
for (int j = 1 + r; j <= n - r - i; j++)
{
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
lable:
for (int i = 1; i <= n; i++)
{
printf("%d%c", a[i], " \n"[i == n]);
}
return 0;
}