冒泡排序1:bubbleSort1.cpp
【题目描述】
给定整数n(待排序整数的个数)和k(冒泡排序的趟数)、以及n个待排序的整数,要求从小到大进行k趟冒泡排序,并输出第k趟冒泡排序后的结果,各整数之间用一个空格隔开。每趟排序从左到右扫描未排序数据,并将最大的元素交换(移动)到未排序数据的右端。
【输入】
输入bubbleSort1.in的第一行有一个整数n(1<n≤30000),为待排序数据的个数;紧接着一行共有n个待排序的整数,每个整数之间用空格隔开;第三行有一个整数k(k³1),为第几趟冒泡排序。
【输出】
输出bubbleSort1.out包括n个整数,是第k趟冒泡排序后的结果,各整数之前有一个空格隔开。
【输入输出样例1】
bubbleSort1.in |
bubbleSort1.out |
16 1 6 14 4 11 9 16 7 8 2 5 12 3 10 13 15 5 |
1 4 6 7 2 5 8 3 9 10 11 12 13 14 15 16 |
【输入输出样例2】
bubbleSort1.in |
bubbleSort1.out |
16 1 6 14 4 11 9 16 7 8 2 5 12 3 10 13 15 20 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
【提示】
对n个数值进行冒泡排序,进行n-1趟排序后,整个排序过程完成,所有数值有序。因此,
(1)若排序趟数k<n-1,则输出数据可能无序、也可能有序;
(2)若k³ n-1,则输出结果都为最终排序结果,实际仅需进行n-1(而不是k)趟排序。
【数据限制】
整数个数n满足:1<n≤30000。
排序趟数k满足:k³1。
#include
const int N0=30001;
/*采用的'冒泡'排序算法, 按升序(从小到大)排序a[]中的元素, 实现:【较大元素从左往右移】*/
void bubbleSort(int a[], int n, int k){
int i, j, flag, t;//i,j-循环控制变量; flag-1趟冒泡排序中是否有发生过元素交换(默认没有0); t-变量交换所需临时空间
for( i=0; i < n-1; i++){ //n-1趟排序
//(A)一趟排序开始之前,将flag标识置为0,意即此趟排序过程中没有元素发生过交换
flag = 0;
//(B)进行一趟"冒泡排序", 遍历j=0 ~ n-1-i的所有元素, 若a[j]比 后一个元素a[j+1]大, 则交换2个元素. 一趟排序的效果是将(0 ~ n-1-i)的最大元素交换到a[n-1-i]位置上!
for( j=0; j a[j+1] ){ //若j位置上的元素 比 j+1位置上的元素大, 则交换a[j]和a[j+1]两个元素
flag = 1; //此趟排序过程中,有元素发生过交换
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
//(C)根据一趟排序过程中是否有元素发生过交换(或排序的趟数已到达k),决定是否进行下一趟排序
if( !flag || i == k-1 ) {//此趟排序过程中没有发生任何元素交换(或排序的趟数已到达k),元素已经有序,不需要再排序,提前退出排序过程!
break;
}
}
}
int main(){
int i, n, a[N0], k; //i-循环变量; n-整数个数; a[]-存储n个整数的数组; k-排序的趟数
//(1)输入数据
scanf("%d", &n); //输入整数n(待排序数值个数)
for( i=0; i
冒泡排序2:bubbleSort2.cpp
【题目描述】
给定整数n(待排序整数的个数)和k(冒泡排序的趟数)、以及n个待排序的整数,要求从小到大进行k趟冒泡排序,并输出第k趟冒泡排序后的结果,各整数之间用一个空格隔开。每趟排序从右到左扫描未排序数据,并将最小的元素交换(移动)到未排序数据的左端。
【输入】
输入bubbleSort2.in的第一行有一个整数n(1<n≤30000),为待排序数据的个数;紧接着一行共有n个待排序的整数,每个整数之间用空格隔开;第三行有一个整数k(k³1),为第几趟冒泡排序。
【输出】
输出bubbleSort2.out包括n个整数,是第k趟冒泡排序后的结果,各整数之前有一个空格。
【输入输出样例1】
bubbleSort2.in |
bubbleSort2.out |
16 1 6 14 4 11 9 16 7 8 2 5 12 3 10 13 15 5 |
1 2 3 4 5 6 7 14 8 11 9 16 10 12 13 15 |
【输入输出样例2】
bubbleSort2.in |
bubbleSort2.out |
16 1 6 14 4 11 9 16 7 8 2 5 12 3 10 13 15 20 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
【提示】
对n个数值进行冒泡排序,进行n-1趟排序后,整个排序过程完成,所有数值有序。因此,
(1)若排序趟数k<n-1,则输出数据可能无序、也可能有序;
(2)若k³ n-1,则输出结果都为最终排序结果,实际仅需进行n-1(而不是k)趟排序。
【数据限制】
整数个数n满足:1<n≤30000。
排序趟数k满足:k³1。
#include
const int N0=30001;
/*采用的'冒泡'排序算法, 按升序(从小到大)排序a[]中的元素, 实现:【较小元素从右往左移】*/
void bubbleSort(int a[], int n, int k){
int i, j, flag, t;//i,j-循环控制变量; flag-1趟冒泡排序中是否有发生过元素交换(默认没有0); t-变量交换所需临时空间
for( i=0; i< n-1; i++ ){ //n-1趟排序
//(A)一趟排序开始之前,将flag标识置为0,意即此趟排序过程中没有元素发生过交换
flag = 0;
//(B)进行一趟"冒泡排序", 遍历j=n-1 ~ 1的所有元素, 若a[j]比 前一个元素a[j-1]小, 则交换2个元素. 一趟排序的效果是将(n-1 ~ i+1)的最小元素交换到a[i]位置上!
for( j=n-1; j>i; j-- ){
if( a[j] < a[j-1] ){ //若j位置上的元素 比 j-1位置上的元素小, 则交换两个元素
flag = 1; //此趟排序过程中,有元素发生过交换
t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
//(C)根据一趟排序过程中是否有元素发生过交换(或排序的趟数已到达k),决定是否进行下一趟排序
if( !flag || i == k-1 ){//此趟排序过程中没有发生任何元素交换(或排序的趟数已到达k),元素已经有序,不需要再排序,提前退出排序过程!
break;
}
}
}
int main(){
int i, n, a[N0], k; //i-循环变量; n-整数个数; a[]-存储n个整数的数组; k-排序的趟数
//(1)输入数据
scanf("%d", &n); //输入整数n(待排序数值个数)
for( i=0; i