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;
}

運行截圖:
在這裏插入圖片描述

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