选择排序:
#include <stdio.h>
//对含有n个数的数组进行遍历
void visit(int r[],int n){
for(int i=0;i<n;i++)
printf("%4d ",r[i]);
printf("\n");
}
//选择排序
void SelectSort(int r[ ], int n){
int i, j, index, temp;
int compare = 0,move = 0;
for (i = 0; i < n - 1; i++) { //对n个记录进行n-1趟选择排序
index = i;
for (j = i + 1; j < n; j++){ //在无序区中查找最小记录
if (r[j] < r[index])
index = j;
compare++; //比较次数增加1
}
if (index != i) { //交换记录
temp = r[i];
r[i] = r[index];
r[index] = temp;
move+=3; //交换一次移动3次
}
visit(r,10);
}
printf("在本次排序中共比较了%d次,移动了%d次。\n",compare,move);
}
int main(){
int r[10]={0};
printf("请依次输入10个整数,用空格隔开:\n");
for(int i=0;i<10;i++)
scanf("%d",&r[i]);
printf("排序之前的记录:\n");
visit(r,10);
printf("进行选择排序:(每趟排序后的结果如下所示)\n");
SelectSort(r,10);
printf("排序之后的记录:\n");
visit(r,10);
return 0;
}
起泡排序:
#include<stdio.h>
//对含有n个数的数组进行遍历
void visit(int r[],int n){
for(int i=0;i<n;i++)
printf("%4d ",r[i]);
printf("\n");
}
void BubbleSort(int r[ ], int n){
int count1 = 0, count2 = 0; //count1和count2记载比较次数和移动次数
int bound, exchange = n - 1; //第一趟起泡排序的区间是[0, n-1]
while (exchange != 0) { //当上一趟排序有记录交换时
bound = exchange;
exchange = 0;
for (int j = 0; j < bound; j++) //一趟起泡排序区间是[0, bound]
if (++count1 && r[j] > r[j+1]){ //注意不能写作count1++
int temp = r[j];
r[j] = r[j + 1];
r[j + 1] = temp;
count2 = count2 + 3; //1次交换是3次移动操作
exchange = j; //记载每一次记录交换的位置
}
visit(r,10); //每趟排序输出一次,观察记录的变动情况
}
printf("本次排序中的比较次数为%d,移动次数为%d。\n",count1,count2);
}
int main(){
int r[10]={0};
printf("请依次输入10个整数,用空格隔开:\n");
for(int i=0;i<10;i++)
scanf("%d",&r[i]);
printf("排序之前的记录:\n");
visit(r,10);
printf("进行冒泡排序:(每趟排序后的结果如下所示)\n");
BubbleSort(r, 10);
printf("排序之后的记录:\n");
visit(r,10);
return 0;
}