1. 程式人生 > >選擇排序-初步探索

選擇排序-初步探索

本篇部落格主要初探選擇排序。我們以前接觸過“在一組數中,如何找出最大的那個數字?”思路就是先預設第一個數字最大,然後遍歷之後的數字,將其與max比較大小,不斷更新max,最後迴圈結束,max的值就是最大數字or最大數字的下標。

本章的“選擇排序”也是這個思路,只不過多了層迴圈的邏輯(假設要求升序排練):每次迴圈都要找出陣列中的最大的那個數字,將其與陣列中的最後一個數字交換,這樣每次都能把一個最大的數歸位;每歸位一個數字,陣列的檢查範圍就縮小一個長度,直至所有數字歸位。圖解如下:

程式碼:

#include<stdio.h>
#include<stdlib.h>
int max(int a[], int len)
{
	int maxid = 0;
	//找出最大值所在的下標
	for (int i = 1; i < len; i++)
	{
		if (a[i]>a[maxid])
		{
			maxid = i;
		}
	}
	return maxid;
}
int main()
{
	int a[] = { 5, 4, 3, 2, 1 };
	int len = sizeof(a) / sizeof(a[0]);
	for (int i = len - 1; i > 0; i--)
	{
		//找出最大數的下標
		int maxid = max(a, i+1);//這裡注意每一次排好一位後陣列檢測範圍都要縮小一個
		int tmp;
		//交換,把最大值放在末尾
		tmp = a[maxid];
		a[maxid] = a[i];
		a[i] = tmp;
	}
	//列印
	for (int i = 0; i < len; i++)
	{
		printf("%d ", a[i]);
	}
	system("pause");
	return 0;
}

排序結果: