排序算法----简单选择排序
排序,简单排序的案例样题
·
题目描述
对输入的n个数进行排序并输出。
输入格式
输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出格式
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。
样例输入
复制
5 5 4 3 1 2
样例输出
复制
1 2 3 4 5
解法一:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
#include <time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//typedef int Status;
#define MAXSIZE 10000 /* 用于要排序数组个数最大值,可根据需要修改 */
typedef struct
{
int r[MAXSIZE+1]; /* 用于存储要排序数组,r[0]用作哨兵或临时变量 */
int length; /* 用于记录顺序表的长度 */
}SqList;
/* 交换L中数组r的下标为i和j的值 */
void swap(SqList *L,int i,int j)
{
int temp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}
void print(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
printf("%d,",L.r[i]);
// printf("%d",L.r[i]);
printf("\n");
}
/* 对顺序表L作简单选择排序 */
void SelectSort(SqList *L)
{
int i,j,min;
for(i=1;i<L->length;i++)
{
min = i; /* 将当前下标定义为最小值下标 */
for (j = i+1;j<=L->length;j++)/* 循环之后的数据 */
{
if (L->r[min]>L->r[j]) /* 如果有小于当前最小值的关键字 */
min = j; /* 将此关键字的下标赋值给min */
}
if(i!=min) /* 若min不等于i,说明找到最小值,交换 */
swap(L,i,min); /* 交换L->r[i]与L->r[min]的值 */
}
}
//#define N 9
int main()
{
int i;
int N;
int d[N];
while(scanf("%d",&N)!=EOF){
for(i=0;i<N;i++){
scanf("%d", &d[i]);
}
SqList l3;
for(i=0;i<N;i++)
l3.r[i+1]=d[i];
l3.length=N;
printf("选择排序:\n");
SelectSort(&l3);
print(l3);
}
}
法二
#include<stdio.h>
int main() {
int n;
int i,j;
while (scanf("%d", &n) != EOF) { //结束标志
int arr[n], min, temp;
for ( i = 0; i < n; i++) //输入
scanf("%d", &arr[i]);
for ( i = 0; i < n - 1; i++) { //选择排序
min = i;
for ( j = i + 1; j < n; j++)
if (arr[min] > arr[j])
min = j;
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
for ( i = 0; i < n; i++) //输出结果
printf("%d ", arr[i]);
printf("\n");
}
return 0;
}
简单来说,简单选择的本质是最基础的冒泡排序的进化,冒泡排序是边处理边查找,但简单选择原理是先查找好了,找到最小值了,然后直接进行sort交换,不用像冒泡一样,每次都要交换。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)