C/C++ 七大排序算法 之 “选择排序”

排序:即将一组混乱的数据按从小到大或者从大到小的顺序进行有序的排列出来。

选择排序算法图解:
在这里插入图片描述

思路解答:
从第一个数开始,跟后面的所有数据进行比较,当有数据比他还小,则标记该数据,然后用标记的数据与后续的数据再进行比较,直到比较完一轮为止,然后拿最后标记的数据与第一个数据做交换。然后开始第二轮的比较,从第二个数据开始与后面的数据比较…

时间复杂度:O(N2)

代码实现:

// 升序选择排序,找到最小的数据排在前面
void SelectionSort_1(int* beauties, int len) {	// 数组,数组的元素个数
	for (int i = 0; i < len - 1; i++) {	// 操作i至len-1个数据(剩下最后一个不需要操作)
		int index = i;	// 赋初值给索引	
		for (int j = i + 1; j < len; j++) {	// 比较剩余未排序的数据
			if (beauties[j] < beauties[index]) {	// 当剩余的数据有比索引对应的数小时,更新索引
				index = j;
			}
		}
		// 当索引不等于初值时
		if (index != i) {
			// 交换数据
			int ret = beauties[index];
			beauties[index] = beauties[i];
			beauties[i] = ret;
		}
	}
}


当然,除了上面的方式外,也还可以利用上面的原理,比较一轮,找到最大的数据,然后与最后的一个数据进行交换,…,一样可以排序出升序的数据!

// 升序选择排序,找到最大的数排在数组的最后面
void SelectionSort_2(int* beauties, int len) {
	for (int i = 0; i < len - 1; i++) {
		int index = 0;
		for (int j = 1; j < len - i; j++) {
			if (beauties[index] < beauties[j]) {
				index = j;
			}
		}

		// 索引值不等于需要交换的索引
		if (index != len - i -1) {
			int ret = beauties[index];
			beauties[index] = beauties[len - i - 1];
			beauties[len - i - 1] = ret;
		}
	}
}


全部代码实现:

#include <iostream>
#include <Windows.h>

using namespace std;

// 升序选择排序,找到最小的数据排在前面
void SelectionSort_1(int* beauties, int len) {	// 数组,数组的元素个数
	for (int i = 0; i < len - 1; i++) {	// 操作i至len-1个数据(剩下最后一个不需要操作)
		int index = i;	// 赋初值给索引	
		for (int j = i + 1; j < len; j++) {	// 比较剩余未排序的数据
			if (beauties[j] < beauties[index]) {	// 当剩余的数据有比索引对应的数小时,更新索引
				index = j;
			}
		}
		// 当索引不等于初值时
		if (index != i) {
			// 交换数据
			int ret = beauties[index];
			beauties[index] = beauties[i];
			beauties[i] = ret;
		}
	}
}


// 升序选择排序,找到最大的数排在数组的最后面
void SelectionSort_2(int* beauties, int len) {
	for (int i = 0; i < len - 1; i++) {
		int index = 0;
		for (int j = 1; j < len - i; j++) {
			if (beauties[index] < beauties[j]) {
				index = j;
			}
		}

		// 索引值不等于需要交换的索引
		if (index != len - i -1) {
			int ret = beauties[index];
			beauties[index] = beauties[len - i - 1];
			beauties[len - i - 1] = ret;
		}
	}
}

int main(void) {
	int beauties[] = { 154, 166, 157, 174, 162, 159, 160, 161, 171 };

	// 获取数组的长度
	int len = sizeof(beauties) / sizeof(beauties[0]);

	
	//SelectionSort_1(beauties, len);

	SelectionSort_2(beauties, len);

	for (int i = 0; i < len; i++) {
		cout << beauties[i] << ", ";
	}
	cout << endl;

	system("pause");
	return 0;
}

运行截图:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章