1. 题目描述
冒泡排序(bubble sort)通过在序列中不断比较和交换相邻的两个元素,最终把所有元素按升序排列。规定相邻元素的交换次数不超过K, 比较次数没有限制,求冒泡排序能生成的字典序最小序列。
输入格式:
第一行输入两个正整数N和K (1<N≤10^3), 1≤K≤N(N−1)/2);
接下来一行输入N个整数,用空格分开。
所有整数值都在区间[0,10^5]内。
输出格式:
在一行中输出排序后的N个整数,用空格分开,末尾的数值后面没有空格。
输入样例1:
3 1
2 1 0
输出样例1:
1 2 0
输入样例2:
8 8
3 1 2 0 3 9 8 1
输出样例2:
0 1 2 3 1 3 9 8
2.思路
从数组的第n位(初始n=0)开始,找到在K次交换范围内能找到的最小值,记录其下标为minp,从minp这个位置开始,将其前面的数字依次往后移一位,然后把minp所在位置的数字放到数组的第n位,次数K-=minp-n。
n+1之后,重复上述过程,直到K=0.
3.代码实现
#include<iostream>
#include<algorithm>
using namespace std;
int N,K;
int A[100];
void bubble_sort(const int N, int K)
{
for(int n=0;n<N-1&&K; n++) //从当前位置为0开始,只要还有次数K,就往后找
{
int minp = n;
for(int m=n+1,k=0; m<N&&k<K; m++,k++) //找到在K次移动范围内所能得到的最小值
{
if(A[m]<A[minp])
{
minp = m;
}
}
int temp = A[minp]; //记录找到的最小元素
for(int j=minp; j>n; j--) //将最小元素前面的元素向后移动
{
A[j] = A[j-1];
}
A[n] = temp; //将最小元素放到当前合适的位置(即n)
K -= minp - n; //次数K被消耗了minp-n次
}
}
int main()
{
cin >> N >> K;
for(int i=0; i<N; i++)
{
int num;
cin >> num;
A[i] = num;
}
bubble_sort(N,K);
for(int i=0; i<N; i++)
{
cout << A[i] << " ";
}
system("pause");
return 0;
}