純手擼——選擇排序
阿新 • • 發佈:2020-08-13
思想:
- 找到最小的元素與第一個元素交換
- 剩下元素中再找最小的元素與第二個元素交換
- 以此類推
今天仍舊看圖寫程式碼,實現起來超級快:
初始時肯定給定一個無序陣列:
先從這些元素中選出一個最小的(或最大的),和第一個元素進行交換,這樣第一個元素就是最小的,第一個元素位置就變成有序區間了
同理,在剩下的無序區間選擇最小的元素,將最小元素與無序區間的第一個元素進行交換,交換後原來無序區間的第一個元素就變為有序區間的最後一個元素了,有序區間遞增一
以此類推,全部元素就可以通過這樣不斷地選擇以及交換排完序
疑難處:如何選出最小的一個元素呢?
很容易想到:先隨便選一個元素假設它為最小的元素(預設為無序區間第一個元素),然後讓這個元素與無序區間中的每一個元素進行比較,如果遇到比自己小的元素,那更新最小值下標,直到把無序區間遍歷完,那最後的最小值就是這個無序區間的最小值
不難寫出:
void SelectSort(int a[],int n)
{
int i,j,min;
for (i = 0; i < n-1; i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[min])
{
min=j; //找到最小值
}
}
if(min!=i) //第一個元素就是最小元素就不動
{
//swap 這裡交換的是最小值和無序區間第一個元素
int tmp=a[min];
a[min]=a[i];
a[i]=tmp;
}
}
}