简单选择排序
1. 原理
-
以升序排序为例:首先需要定义一个值k,表示最小的小标,假设第一个数时最小的,把第一个数据下标赋值给K = 0;然后依次让后面的数据和a[k]相比,比它小的就将其值赋给K。后面依次如此,比较完毕后,判断数据i是否和k相等,如果不相等,则表明后面有比a[i]小的值,然后将其与a[i]交换,此时,数组中第一个元素就是最小值了。然后将 k = i+1,继续循环比较。举个列子:
-
比如说有5个数字 5,4,3,2,1
定义一个k = 0;
首先k 指向第一个元素;
-
i = 0;i < 5;j < 5
k = 0,
j = 1; a[0] > a[1],成立,k = j = 1;
j = 2; a[1] > a[2],成立,k = j = 2;
j = 3; a[3] > a[2],成立,k = j = 3;
j = 4; a[4] > a[1],成立,k = j = 4;
内存循环完成,k = 4,i = 0,k != i,交换a[k]和a[i]的值
交换完成后,{1,4,3,2,5} -
i = 1;i < 5;j < 5
k = 1,
j = 2;a[1] > a[2],成立,k = j = 2
j = 3;a[2] > a[3],成立,k = j = 3
j = 4;a[3] > a[4],不成了
内存循环完成,k = 3,i = 1,k!= i,交换a[k]和a[i]的值
交换完成后,{1,2,3,4,5} -
i = 2;i < 5;j < 5
k = 2,
j = 3,a[2] > a[3] ,不成立
j = 4,a[2] > a[4],不成立
内存循环完成,k = 2, i = 2,k == i,不交换a[k]和a[i]的值
数组内容依旧为{1,2,3,4,5} -
i = 3; i < 5;j < 5
k = 3;
j = 4, a[3] > a[4] ,不成立 -
i = 4;i < 5;j < 5
k = 4;
j = 5; j < 5,不成立,退出内存循环
k = 4,i = 4 ,k == i ,不交换a[k]和a[i]的值
i++==>i = 5,循环结束。最终a[5] = {1,2,3,4,5}
- 接着重新让k指向第二个数的下标,开始下一轮循环
二、实现实现代码讲解
void simple_select_sort(int a[],int len)
{
int i,j,k;
for(i = 0;i < len -1 ;i++)
{
k = i;
for(j = i + 1; j < len;j++)
{
if(a[j] < a[k])
k = j; //寻找到最小的值
}
if(i != k) //如果i的值不等于k即存在比a[i]小的值,将该值插入到a[i]位置
{
a[i] ^= a[k];
a[k] ^= a[i];
a[i] ^= a[k];
}
}
}
三、总结
- 简单选择排序的时间复杂度和冒泡排序的时间复杂度是一样的,都是O(n^2),且是稳定的。