选择排序
原理
每次选择当前序列中最小的数,放在序列的起始位置
思路
1.选择序列中最小的数,与序列的第一个数交换位置
2.选择序列第二个数到最后一个数中最小的数,与第二个数交换位置
…
3.每一趟选择当前序列中最小的数,放在当前序列的起始位置
分析
冒泡排序通过依次比较,交换相邻两个数,从而将最大的数放在最终位置,选择排序每遍历一次记录下最小的数,然后进行一次的换位
选择排序是不稳定的排序算法,表现在最小元素和A[i]交换的时候
复杂度
时间复杂度
空间复杂度
代码
#include<stdio.h>
#include<stdlib.h>
void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//选择排序
void select(int A[], int n){
int min, i, j;
for (i = 0; i < n - 1; i++){
min = i;
for (j = i + 1; j < n; j++)
if (A[j]<A[min])
min = j;
if (min != i)
swap(&A[i], &A[min]);
}
}
//双向选择排序,每次选择最大的和最小的值
void select_2(int A[], int n){
int min, max, i, j;
for (i = 0; i < n - i; i++){
min = max = i;
for (j = i + 1; j < n - i; j++){
if (A[j] > A[max])
max = j;
if (A[j] < A[min])
min = j;
}
if (min != i)
swap(&A[i], &A[min]);
if (max != n - i - 1)
if (max == i) //如果最大值是第一个,此时的最大值已通过上一步到到原min位置上
swap(&A[min], &A[n - i - 1]);
else
swap(&A[max], &A[n - i - 1]);
}
}
int main() {
int A[] = {2, 5, 7, 3, 4, 1, 9, 6, 8};
int n = sizeof(A) / sizeof(int);
select_2(A, n);
for (int i = 0; i < n; i++)
printf("%d ", A[i]);
}