选择排序(Select Sort)
视频讲解链接:【十大排序算法】用可视化动画讲选择排序
1、介绍
? 从头到尾扫描待排序列,找出最小的一个元素,和当前未排序序列的第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
2、算法步骤
第一轮从arr[0]~arr[n-1]中选取最小值,与 arr[0]交换
第二轮从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换
第三次轮从arr[2]~arr[n-1]中选取最小值,与 arr[2]交换
…
第 n-1 轮从arr[n-2]~arr[n-1]中选取最小值,与 arr[n-2]交换
总共通过 n-1 轮,得到一个按从小到大排列的有序序列。
3、代码实现
1、Java版代码
package sort;
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
int [] arr = {44,100,61,3,72,19};
selectSort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}
public static void selectSort(int[] arr) {
int indexLast = arr.length - 1;
for (int currentFirstIndex = 0; currentFirstIndex <= indexLast - 1; currentFirstIndex++) {
int minIndex = currentFirstIndex;
for (int compareIndex = currentFirstIndex + 1; compareIndex <= indexLast; compareIndex++) {
if (arr[minIndex] > arr[compareIndex]) {
minIndex = compareIndex;
}
}
if(minIndex != currentFirstIndex) {
int temp = arr[minIndex];
arr[minIndex] = arr[currentFirstIndex];
arr[currentFirstIndex] = temp;
}
}
}
}
2、C语言版代码
#include <stdio.h>
void swap (int a[], int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void printArr (int *a, int len) {
int i;
for (i = 0; i < len; i++) {
printf ("%4d", a[i]);
}
printf ("\n");
}
int main() {
int a[6] = {44,100,61,3,72,19};
int len = sizeof(a) / sizeof(a[0]);
int currentFirstIndex;
int compareIndex;
int minIndex;
int indexLast = len - 1;
for (currentFirstIndex = 0; currentFirstIndex <= indexLast-1; currentFirstIndex++) {
minIndex = currentFirstIndex;
for (compareIndex = currentFirstIndex + 1; compareIndex <= indexLast; compareIndex++) {
if (a[minIndex] > a[compareIndex]) {
minIndex = compareIndex;
}
}
if (minIndex != currentFirstIndex) {
swap (a, currentFirstIndex, minIndex);
}
}
printArr (a, len);
return 0;
}
4、时空复杂度
时间复杂度:O(n2)
? 双层for循环
空间复杂度:O(1)
? 排序过程中始终只用到了原来数组的空间
5、稳定性
选择排序是不稳定的排序算法
? 稳定性:排序前两个值相等的元素的前后位置顺序和排序后它们两个的前后位置顺序相同
6、结束语
? 打开微信扫描小程序码体验选择排序动画演示:
|