数据结构与算法 ——选择排序

选择排序

一、概念

基础概念:选择排序是冒泡排序的改进,它与冒泡排序很相似,都是比较 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)

猜你喜欢

转载自blog.csdn.net/weixin_43725997/article/details/89280336