#include <iostream>
#define CountOfArray(a) (sizeof(a)/sizeof(a[0]))
using std::cout;
using std::endl;
/** Selection Sort**/
int findMaxItemIndex(int dataList[], int leftPos, int rightPos)
{
int maxPos = leftPos;
int currentPos= leftPos;
while(++currentPos < rightPos)
{
if(dataList[currentPos] > dataList[maxPos])
{
maxPos = currentPos;
}
}
return maxPos;
}
void selection_sort(int dataList[], int count)
{
//錯誤的用法:參數傳進來的數組指針,sizeo函數調用後應該是指針的長度而不是數組的長度。
int len = CountOfArray(dataList);
if(len != count)
{
cout<<"Array len is :"<<len<<endl;
cout<<"Array Lenght is not right."<<endl;
return;
}
for(int i=count-1; i>0; --i)
{
int curMaxPos = findMaxItemIndex(dataList, 0, i);
if(curMaxPos != i)
{
int temp = dataList[i];
dataList[i] = dataList[curMaxPos];
dataList[curMaxPos] = temp;
}
}
}
int main()
{
const int count = 10;
int data[count] = {7,2,6,4,0,9,5,1,3,8};
int len = CountOfArray(data); //正確的用法
if(len != count)
{
cout<<"Array Lenght is not right."<<endl;
return -1;
}
selection_sort(data, count);
for(int i = 0; i< count; i++)
{
cout<<data[i]<<endl;
}
getchar();
}
關於sizeof的誤用問題
編程練習寫選擇排序算法的時候,居然把sizeof函數使用錯了,感覺還是有必要在這裏寫博客記錄一下自己犯的這個低級錯誤,以警示自己編碼:
下面是具體代碼:
如果sizeof(數組名)的調用有兩種情況:
1. 數組作爲參數壓棧,並作爲參數傳入sizeof(數組名):計算出來的值實際上是指針的長度。
2. 數組是在當前的函數中定義,隨後作爲參數傳入sizeof(數組名):計算出來的值是整個數組的長度。但是如果當數組作爲函數的參數進行傳遞時,該數組自動退化爲同類型的指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.