选择排序
一、概念
基础概念:选择排序是冒泡排序的改进,它与冒泡排序很相似,都是比较 n-1 轮,每轮都是比较 n–1–i 次,每轮找出一个最大值或最小值。
但是冒泡排序,每轮比较中,只要后一个数比当前数值更大,就要交换一次。(就是让最大的那个数不断的与后面的数交换位置,不断的冒上去)交换次数过多。
而选择排序,每轮比较只要找出最小数的下标,然后与当前位置进行一次交换即可。交换次数大大减少。
通俗理解: 冒泡是大的往后冒,不可以存在“跳格”,只能从数组的下标开始0 - 1 - 2 - 3 …一个一个的往后冒(交换) 直到最数组的最末端。
而选择排序是,每轮比较中,都找出当前待比较序列中,最小数的下标 。然后进行交换。每轮比较只要发生一次交换操作。
二、代码及过程
/**
*
*选择排序
*Date: 2019/4/13
*
***/
#include <stdio.h>
// 选择排序
void select(int *a, int n){
int i,j; // 循环遍历
int minIndex; // 保存最小值的下标
int temp; // 交换所需要使用的临时变量
for(i = 0; i < n-1 ; i++){ // n个数,进行n-1轮比较
minIndex = i;
for(j = i+1; j < n; j++){ // 每轮比较n-i-1次(和冒泡相同),找出本轮的最小数的下标
if(a[minIndex] > a[j]){
minIndex = j;
}
}
if(minIndex != i){
temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
}
// 遍历数组
void show(int *a,int n){
for(int i = 0; i < n; i++){
printf("%5d",a[i]);
}
}
void main(){
int a[] = {35,22,17,-20,22,99,46};
int n = sizeof(a) / sizeof(a[0]); // 数组长度
printf("原数组:\n");
show(a,n);
select(a,n);
printf("\n排序后的数组:\n");
show(a,n);
printf("\n");
}
三、复杂度
时间复杂度: O(n²)
空间复杂度: O(1)