1.定义
选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(或末尾)位置,直到全部待排序的数据元素排完。
2.原理
选择排序的主要原理是通过不断的选择剩余元素中的最小者。
首先,找到数组中最小的元素并将其和数组第一个元素交换位置,然后找到数组剩下元素中最小的元素并将其与数组的第二个元素交换,依此类推。
3.举例
假设我们有一组待排序的数字: [29, 10, 14, 37, 13]
- 第一步: 在未排序的数组中找到最小元素(10),将其与第一个元素交换位置,得到 [10, 29, 14, 37, 13]
- 第二步: 在剩下的未排序数组中找到最小元素(13),与第二个元素交换位置,得到 [10, 13, 14, 37, 29]
- 第三步: 在剩下的未排序数组中找到最小元素(14),已经在正确的位置,不需要交换
- 第四步: 在剩下的未排序数组中找到最小元素(29),与第四个元素交换位置,得到 [10, 13, 14, 29, 37]
- 最后一步: 剩下的一个元素(37)已经在正确的位置,排序完成。
4.思路
下面的这个思路是基于由小到大排序的,由大到小是一样的思路
1.定义一个变量k,首先保存第一个元素的下标,k=0,从第二个元素开始,依次和arr[k]进行比较,若有数据比arr[k]小,k就记录较小值的下标,一轮比较完毕之后,k就记录着最小值的下标
2.判断下标k的值和初始值,是否相同,若是相同(即k没动),说明当前位置是最小的,不做任何操作,若是不同,说明最小的值在后面,则交换arr[k]和arr[初始下标]的值
3.第二轮,k=1开始,后面的步骤以此类推
5.代码
#include<stdio.h>
//输出函数
void output_array(int *p,int len){
int i = 0;
for(i = 0;i < len;i++){
printf("%d ",p[i]);
}
printf("\n");
return;
}
//交换函数
void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
return ;
}
//排序函数
void select_sort(int *p,int len){
int i = 0,j = 0,k = 0;
//只需len-1次,遍历数组中除最后一个元素外所有的元素
for(i = 0;i < len - 1;i++){
//k记录起始值
k = i;
//从下一个元素开始比较
for(j = k + 1;j < len;j++){
if(p[j] < p[k]){
k = j;
}
}
//判断这个k是否为初始值
if(k != i){
//如果不为初始值的话,则说明需要发生交换
swap(&p[k],&p[i]);
}
}
return ;
}
int main(){
// k
int a[5] = {29,10,14,37,13};
// j
int len = sizeof(a) / sizeof(a[0]);
printf("原始数据为:\n");
output_array(a,len);
printf("经过简单选择排序之后的数据为:\n");
select_sort(a,len);
output_array(a,len);
return 0;
}