1. 程式人生 > >選擇排序再理解

選擇排序再理解

  在學習了氣泡排序之後,再來學習選擇排序應該就能更好理解這個演算法了。
  選擇排序比較直觀,就是從沒有排序的元素中選出最大或最小的元素放到已排序好的元素後面。

選擇排序
 1、比較未排序區域的元素,選出最大或最小的元素放到排序區域。
 2、一趟比較完成之後,再從剩下未排序的元素開始比較。
 3、反覆執行以上步驟,只到排序完成。

演算法

function selectSort(nums){
	let n = nums.length;
	let minIndex,temp;
	for(let i=0;i<n-1;i++){
		minIndex = i;
		for(let j=i+1
;j<n;j++){ if(nums[minIndex]>nums[j]){ minIndex = j; } } temp = nums[i]; nums[i] = nums[minIndex]; nums[minIndex] = temp; } return nums; }

疑惑探究
 疑惑1:雙迴圈的理解
 探究1:外層迴圈控制總共需要跑的趟數,n個元素需要n-1趟,和氣泡排序相同,迴圈條件:

	for(let i=0;i<n-1;i++){}

  內層迴圈控制剩下未排序元素的遍歷,已經排過序的不用在排序。每次開始的元素是逐漸往後的,所以內層迴圈的j=i,又因為自己不用和自己比較,j=i+1。

	for(let j=i+1;j<n;j++){}

  疑惑2:交換方式

	temp = nums[i];
	nums[i] = nums[minIndex];
	nums[minIndex] = temp;

  探究2:和氣泡排序不同,這個交換在外層迴圈的時候進行交換,而不是和氣泡排序一樣每次內層迴圈判斷都要交換。
    從這個交換方式可以看出,每次交換是迴圈開始的元素與選擇出來最小或最大的元素交換,也就是說每次交換之後都會把選擇出來的元素放到前面排序好元素的後面。

簡要概括
  選擇排序的理解更直接,就是選出最小的或最大的元素放到排序元素的後面,然後再從剩下未排序的元素繼續選擇。與氣泡排序有相同之處,也有不同之處,需要好好分析和理解,否則就會搞混淆。