選擇排序

思想: 把要排序的序列分爲兩個序列,分別是有序序列和無序序列。一開始,因爲還沒有進行排序,所以整個序列都是無序的,所以有序序列爲空,然後以升序爲例,進行一次循環,挑出最小的數,放到無序序列的最前邊,然後進行一次劃分,將剛選出的這個數當做有序序列,剩下的數當做現有的無序序列,再進行循環挑出最小的數,放到最前邊,再歸類成有序序列的一部分,現在有序序列有兩個數,剩下的所有數都是無序序列的,就這樣進行一次一次的選擇,挑出最小的數,放到有序序列裏。拿圖來說:
在這裏插入圖片描述
優化: 前邊說道,每次選一個最小的數出來,放在序列的開頭,但是這樣感覺糟蹋了一次循環啊!因爲我們同時還可以選出來一個最大的數放在序列的末尾!

那麼看代碼:

void SelecSort(int *a,int n) {
	int begin = 0;
	int end = n - 1;
	while (begin<end) {
		int mini = begin, maxi = end;
		for (int i = begin; i < end; ++i) {
			if (a[maxi] < a[i])
				maxi = i;
			if (a[mini] > a[i])
				mini = i;
		}

		if (begin == maxi)  // 這裏爲什麼要加個判斷呢?且聽我給你細細分析。
			maxi = mini;
		Swap(&a[mini], &a[begin]);
		Swap(&a[maxi], &a[end]);

		++begin;
		--end;
	}
}

在這裏插入圖片描述

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