选择排序的原理及示例
写算法的步骤,先用自然语言描述算法,第一步要做什么、第三步要做什么…,最后再用编程语言表达出来。
- 假设第一个元素是最小的,然后与第二个元素比较,找到最小的,继续与第三个元素比较,找到最小的,至到与最后一个元素比较,找到最小的,到此,第一轮里就找到了最小的元素。然后将这个最小的元素与第一位的元素互换,这样,最小的元素就到了最左边。
- 假设第二个元素是最小的,然后与第三个元素比较,找出第二小的,继续与第四个元素比较,找出第二小的,一直比较到最后一个元素,最找到除第一元素外,剩下的元素中最小的,将这个元素与第二个元素互换位置,这样第二小的元素就排到了最左边,排在最小的元素后面
- 对剩下的元素重复上述操作
- 排序完成
#include <stdio.h>void sort(int *arr,int size){for(int i = 0;i < size;i++){int minIndex = i;for(int j = i+1;j < size;j++){if(arr[j]< arr[minIndex]){minIndex = j;}}if(minIndex != i) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex]=temp;}}
}int main(){int arr[8] = {5,8,6,3,9,2,1,7};sort(arr,8);for(int i =0; i < 8;i++){printf("%d\t",arr[i]);}printf("\n");return 0;
}
算法每一轮会选出一个最小值,再交换到左侧的时间复杂度是O(n),总共要迭代n-1次,所以时间复杂度为O(n2)。
因为该算法是原地排序的,并没有用到额外的存储空间,所以排序的空间复杂度为O(1)。
选择排序比冒泡排序有着交换次数更少的优点,但是它的缺点的是不稳定。这里的不稳定指的是当数列中有着多个值相等的元素时,选择排序有可能打乱了它们原有的顺序。也就是值相等的元素在数列中的相对位置不变,就是稳定,变了,就是不稳定。
