选择排序1:selectSort1.cpp
【题目描述】
给定整数n(待排序整数的个数)和k(选择排序的趟数)、以及n个待排序的整数,要求从小到大进行k趟选择排序,并输出第k趟选择排序后的结果,各整数之间用一个空格隔开。每趟排序从左到右扫描未排序数据,记录值最小的元素的下标,然后将最小的元素交换(移动)到未排序数据的左端。
【输入】
输入selectSort1.in的第一行有一个整数n(1<n≤30000),为待排序数据的个数;紧接着一行共有n个待排序的整数,每个整数之间用空格隔开;第三行有一个整数k(k³1),为第几趟选择排序。
【输出】
输出selectSort1.out包括n个整数,是第k趟选择排序后的结果,各整数之前有一个空格。
【输入输出样例1】
selectSort1.in |
selectSort1.out |
16 1 6 14 4 11 9 16 7 8 2 5 12 3 10 13 15 5 |
1 2 3 4 5 9 16 7 8 6 11 12 14 10 13 15 |
【输入输出样例2】
selectSort1.in |
selectSort1.out
扫描二维码关注公众号,回复:
2586311 查看本文章
|
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[]中的元素, 实现:【选择最小元素放在左端】, 排序趟数=k*/
void selectSort(int a[], int n, int k){
int i, j, min, t;//i,j-循环控制变量; min-此趟排序中选到的最小元素的下标; t-变量交换所需临时空间
for( i=0; i< n-1; i++ ){ //n-1趟排序
//(A)一趟排序开始之前,将min标识置为i,即默认将a[i]视为a[k](k=i~n-1)中最小的元素
min = i;
//(B)进行一趟"选择排序", 遍历j=i+1 ~ n-1的所有元素, 若a[j]比 现有最小元素a[min]小, 则更新最小元素的下标min!
for( j=i+1; j<=n-1; j++ ){
if( a[j] < a[min] ){ //若j位置上的元素 比min位置上的元素小, 则更新最小元素的下标min
min = j;
}
}
//(C)已获得j=i+1 ~ n-1的所有元素中最小元素的下标min, 若其不在位置i, 则交换到位置i
if( min != i ){//若最小元素a[min]不是a[i], 则把最小元素a[min]交换到a[i]
t = a[min];
a[min] = a[i];
a[i] = t;
}
//(D)如果已经排序了k趟, 则停止排序&&强制退出
if( i == k-1 ){
break;
}
}
}
int main(){
int i, n, a[N0], k; //i-循环变量; n-整数个数; a[]-存储n个整数的数组; k-排序的趟数
//(1)输入数据
scanf("%d", &n); //输入整数n(待排序数值个数)
for( i=0; i
选择排序2:selectSort2.cpp
【题目描述】
给定整数n(待排序整数的个数)和k(选择排序的趟数)、以及n个待排序的整数,要求从小到大进行k趟选择排序,并输出第k趟选择排序后的结果,各整数之间用一个空格隔开。每趟排序从右到左扫描未排序数据,记录值最大的元素的下标,然后将最大的元素交换(移动)到未排序数据的右端。
【输入】
输入文件selectSort2.in的第一行有一个整数n(1<n≤30000),为待排序数据的个数;紧接着一行共有n个待排序的整数,每个整数之间用空格隔开;第三行有一个整数k(k³1),为第几趟选择排序。
【输出】
输出文件selectSort2.out包括n个整数,是第k趟选择排序后的结果,各整数之前有一个空格。
【输入输出样例1】
selectSort2.in |
selectSort2.out |
16 1 6 14 4 11 9 16 7 8 2 5 12 3 10 13 15 5 |
1 6 10 4 11 9 3 7 8 2 5 12 13 14 15 16 |
【输入输出样例2】
selectSort2.in |
selectSort2.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[]中的元素, 实现:【选择最大元素放在右端】, 排序趟数=k*/
void selectSort(int a[], int n, int k){
int i, j, max, t;//i,j-循环控制变量; max-此趟排序中选到的最大元素的下标; t-变量交换所需临时空间
for( i=0; i=0; j-- ){
if( a[j] > a[max] ){ //若j位置上的元素 比max位置上的元素大, 则更新最大元素的下标max
max = j;
}
}
//(C)已获得j=n-2-i ~ 0 的所有元素中最大元素的下标max, 若其不在位置i, 则交换到位置i
if( max != n-1-i ){//若最小元素a[max]不是a[n-1-i], 则把最大元素a[max]交换到a[n-1-i]
t = a[max];
a[max] = a[n-1-i];
a[n-1-i] = t;
}
//(D)如果已经排序了k趟, 则停止排序&&强制退出
if( i == k-1 ){
break;
}
}
}
int main(){
int i, n, a[N0], k; //i-循环变量; n-整数个数; a[]-存储n个整数的数组; k-排序的趟数
//(1)输入数据
scanf("%d", &n); //输入整数n(待排序数值个数)
for( i=0; i