选择排序、冒泡排序、二分查找(折半查找)

大家觉得选择排序和冒泡排序?哪种效率和速度好些呢?

其实要看场合,也就是看数据的储存环境。

一般数据是随机分散储存的,可以优先使用选择法。

如果数据是连续存储的,优先使用冒泡法。

冒泡排序:

void main()
{
  int szData[] = {3, 2, 1, 4, 5, 2, 11, 7, 33, 6, 9};
  int iCount = sizeof(szData)/sizeof(szData[0]);
  for (int i = 0; i < iCount; i++)
    for(int j = 0; j < iCount-1; j++ )
    {
      if (szData[j] > szData[j+1])
      {
        int iTemp = szData[j];
        szData[j] = szData[j+1];
        szData[j+1] = iTemp;
      }
    }
}

选择法排序:

void main()
{
  int szData[] = {3, 2, 1, 4, 5, 2, 11, 7, 33, 6, 9};
  int iCount = sizeof(szData)/sizeof(szData[0]);

  for (int i = 0; i < iCount; i++)
  {
    int iMin = i;
    for (int j = i; j < iCount; j++)
    {
      if (szData[j] < szData[iMin])
        iMin = j;
    }
    if (iMin != i)
    {
      int iTemp = szData[iMin];
      szData[iMin] = szData[i];
      szData[i] = iTemp;
    }
  }
}

二分查找法,是对于有序的储存数据的查找算法,算法时间复杂度为: O(log2n)

也就是对数阶,效率仅次于常量阶。说以说。在有序并且修改情况很少数据使用二分查找。效率是很高滴!

算法:

// 二分查找算法
int FindBy2(int* pData, int iData, int iCount)
{
  int iLeft  = 0;
  int iRight = iCount-1;
  int iIndex = 0;
  while (iLeft <= iRight)
  {
    iIndex = (iRight+iLeft)/2;
    if (pData[iIndex] == iData)
    {
      return iIndex;
    }
    else if (pData[iIndex] > iData)
    {
      iRight= iIndex - 1;
    }
    else if (pData[iIndex] < iData)
    {
      iLeft = iIndex + 1;
    }
  }
  return -1;
}

int main(int argc, char* argv[])
{
  int szData[] = {1,2,3,4,5,6,7,8,9};
  int iCount = sizeof(szData)/sizeof(szData[0]);

  int iIndex = FindBy2(szData, 5, iCount);
  return 0;
}

 

posted @ 2013-05-22 00:18  0x苦行僧  阅读(222)  评论(0编辑  收藏  举报