今天學習了選擇排序,選擇排序和冒泡排序思路上有一點相似,都是先確定最小元素,再確定第二笑元素,最后確定最大元素。他的主要流程如下:
1.加入一個數組A = {5,3,6,2,4,7},我們對他進行排序
2.確定最小的元素放在A[0]位置,我們怎么確定呢,首先默認最小元素為5,他的索引為0,然后用它跟3比較,比他打,則認為最小元素為3,他的索引為1,然后用3跟6比,發現比他小,最小元素還是3,然后跟2比,最小元素變成了2,索引為3,然后跟4比,跟7比。當比較結束之后,最小元素也塵埃落定了。就是2,索引為3,然后我們把他放在A[0]處。為了使A[0]原有數據部丟失,我們使A[0](要放的位置) 與A[3](最小數據的位置)交換。這樣就不可以了嗎?
3.然后我們在來找第二小元素,放在A[1],第三小元素,放在A[2]。。當尋找完畢,我們排序也就結束了。
4.不過,在找的時候要注意其實位置,不能在找A[2]的時候,還用A[2]的數據跟已經排好的A[0],A[1]比,一定要跟還沒有確定位置的元素比。還有一個技巧就是我們不能每次都存元素值和索引,我們只存索引就可以了,通過索引就能找到元素了。呵呵。
5.他和冒泡的相似和區別,冒泡和他最大的區別是他發現比他小就交換,把小的放上面,而選擇是選擇到最小的在直接放在確定的位置。選擇也是穩定的排序。
基本思路就這樣了,奉上源代碼:
#include <stdio.h>
#include <stdlib.h>
//選擇排序, pnData要排序的數據, nLen數據的個數
int SelectSort(int* pnData, int nLen)
{
//i從[0,nLen-1)開始選擇,確定第i個元素
for (int i = 0; i < nLen - 1; ++i)
{
int nIndex = i;
//遍歷剩余數據,選擇出當前最小的數據
for (int j = i + 1; j < nLen; ++j)
{
if (pnData[j] < pnData[nIndex])
{
nIndex = j;
}
}
//如果當前最小數據索引不是i,也就是說排在i位置的數據在nIndex處
if (nIndex != i)
{
//交換數據,確定i位置的數據。
int nTemp = pnData[i];
pnData[i] = pnData[nIndex];
pnData[nIndex] = nTemp;
}
}
return 1;
}
int main()
{
int nData[10] = {4,10,9,8,7,6,5,4,3,2}; //創建10個數據,測試
SelectSort(nData, 10); //調用選擇排序
for (int i = 0; i < 10; ++i)
{
printf("%d ", nData[i]);
}
printf("\n");
system("pause");
return 0;
}