经典排序算法_选择排序

选择排序

原理

每次选择当前序列中最小的数,放在序列的起始位置

思路

1.选择序列中最小的数,与序列的第一个数交换位置
2.选择序列第二个数到最后一个数中最小的数,与第二个数交换位置

3.每一趟选择当前序列中最小的数,放在当前序列的起始位置

分析

冒泡排序通过依次比较,交换相邻两个数,从而将最大的数放在最终位置,选择排序每遍历一次记录下最小的数,然后进行一次的换位
选择排序是不稳定的排序算法,表现在最小元素和A[i]交换的时候
复杂度
时间复杂度 O ( n 2 ) O(n^2)
空间复杂度 O ( 1 ) O(1)

代码

#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]);
}
发布了23 篇原创文章 · 获赞 0 · 访问量 213

猜你喜欢

转载自blog.csdn.net/qq_37876050/article/details/104287436