提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
记录对2种排序的理解
冒泡排序
简单的选择排序
一、冒泡排序与选择排序是什么?
冒泡算法:
冒泡排序是一种交换排序,它的思想是: 每次比较两个相邻的元素, 如果他们反序就把他们交换位置,直到没有反序的记录为止。
以下面五个数为例, 从大到小排序, 对相邻的两位进行比较,数据为:12, 35, 99, 18, 76
* 第一趟:
* 第一次比较: 35, 12, 99, 18, 76
* 第二次比较: 35, 99, 12, 18, 76
* 第三次比较: 35, 99, 18, 12, 76
* 第四次比较: 35, 99, 18, 76, 12
经过第一趟比较后, 五个数中最小的数已经在最后面了, 接下来只比较前四个数, 依次类推
* 第二趟
99, 35, 76, 18, 12
* 第三趟
99, 76, 35, 18, 12
* 第四趟
99, 76, 35, 18, 12
比较完成
所以,冒泡排序的原理为: 每一趟只能将一个数归位, 如果有n个数进行排序,只需将n-1个数归位, 也就是说要进行n-1趟操作(已经归位的数不用再比较)。
选择排序:
简单选择排序的基本思想就是在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
这里的理解更多的参考了其他大佬的分析–原文链接:https://blog.csdn.net/Chenyukuai6625/article/details/77170059
二、使用步骤
1.冒泡算法
代码如下:
#include<stdio.h>
void Swap(int* arr, int x, int y)
{
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
void sel_sort(int* arr, int num)
{
int left = 0;
int right = num - 1;
while (left < right)
{
//先假设最左侧元素的下标未为最小元素的下标,最右侧元素的下标为最大元素的下标。
int min = left;
int max = right;
int i = 0;
for (i = left; i <= right; i++)
{
if (arr[i] < arr[min])
{
min = i;
}
if (arr[i] > arr[max])
{
max = i;
}
}
//最大值放在最右端
Swap(arr, max, right);
//由于上一步把下标(right)和(max)上的数据进行了交换
//所以得考虑最小值(arr[min])在位置(right)的情况,即:此时的 min = right;
if (min == right)
{
min = max;
}
//最小值放在最左端
Swap(arr, min, left);
//每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1
left++;
right--;
}
}
int main()
{
int i = 0;
int arr[] = { 3,5,9,2,4,7 };
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
sel_sort(arr, sz);//选择排序
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.简单的选择排序
代码如下:
#include<stdio.h>
int main()
{
int array[]={12,8,13,9}
int i;
int j;
int tmp;
int len=sizeof(array)/sizeof(array[0]);
//简单的选择排序法
for(i=0;i<len-1;i++){
for(j=i+1;j<len;j++){
if(array[i]<array[j]){
tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
}
}
for(i=0;i<len;i++){
printf("%d",array[i]);
}
return 0;
}
总结
有个形容非常贴切
冒泡排序就像暴力遍历,空间复杂度小,时间复杂度高;
而简单的选择排序就像在等待时机伺机而动;