冒泡排序
重复地“遍历”要排序的列表,依次比较相邻的两个元素,如果它们的顺序错误(例如,前一个比后一个大),就交换它们。每一轮遍历都会将当前未排序部分中的最大(或最小)元素“冒泡”到其正确位置的末端,像水中的气泡一样上浮。
工作原理(以升序排序为例):
- 从列表的第一个元素开始,比较相邻的两个元素。
- 如果第一个比第二个大,就交换它们。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对。完成这一步后,最大的元素就“冒泡”到了列表末尾。
- 针对所有未排序的元素(除了上一轮已经确定位置的元素),重复上述步骤,直到没有任何一对数字需要比较(即列表完全有序)。
#include <stdio.h>
void bubbleSort(int *list, int n)
{
int i;
int j;
int temp;
// 外层循环控制排序轮数
for(i = 0; i < n-1; i++)
{
// 内层循环进行相邻元素比较
for(j = 0; j < n-1-i; j++)
{
if(list[j] > list[j+1])
{
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
}
选择排序
将列表分为已排序区间和未排序区间。每次从未排序区间中选择最小(或最大)的元素,将其与未排序区间的第一个元素进行交换,从而将其放到已排序区间的末尾。如此重复,直到所有元素排序完毕。
工作原理(以升序排序为例):
- 初始时,已排序区间为空,未排序区间为整个列表。
- 在未排序序列中找到最小(或最大)的元素。
- 将其与未排序区间的第一个元素进行交换。
- 此时,未排序区间的第一个元素(即刚找到的最小值)就加入了已排序区间的末尾。
- 重复步骤2-4,直到未排序区间为空。
//选择排序函数
void selectSort(int *list, int n)
{
int i;
int j;
int temp;
int minIndex; // 只记录最小值的下标,不需要 minvalue 变量
for(i = 0; i < n-1; i++)
{
minIndex = i; // 假设当前元素是最小值
for(j = i+1; j < n; j++)
{
if(list[j] < list[minIndex])
{
minIndex = j; // 更新最小值的下标
}
}
// 如果最小值不是当前位置,交换
if(minIndex != i)
{
temp = list[i];
list[i] = list[minIndex];
list[minIndex] = temp;
}
}
}
main主函数程序入口
int main()
{
int i;
int myarray[] = {3, 9, 2, 7, 5};
int n = sizeof(myarray)/sizeof(int); // 计算元素个数
printf("采用冒泡排序前:\n");
for(i = 0; i < n; i++)
{
printf("%d ", myarray[i]); // 添加空格分隔
}
printf("\n");
bubbleSort(myarray, n); // 调用冒泡排序
printf("采用冒泡排序后:\n");
for(i = 0; i < n; i++)
{
printf("%d ", myarray[i]);
}
printf("\n\n");
// 重新初始化数组 - 进行选择排序
int myarray2[] = {3, 9, 2, 7, 5};
int n2 = sizeof(myarray2)/sizeof(int);
printf("采用选择排序前:\n");
for(i = 0; i < n2; i++)
{
printf("%d ", myarray2[i]);
}
printf("\n");
selectSort(myarray2, n2); // 调用选择排序
printf("采用选择排序后:\n");
for(i = 0; i < n2; i++)
{
printf("%d ", myarray2[i]);
}
printf("\n");
return 0;
}
运行结果展示
注意
冒泡排序:
1. 外层循环从 0 到 n-2
2. 内层循环从 0 到 n-1-i
选择排序:
1. 添加条件判断,只有当最小值不在当前位置时才交换
2. 内层循环从 i+1 开始

1449

被折叠的 条评论
为什么被折叠?



