选择排序、冒泡排序、二分查找(折半查找)
大家觉得选择排序和冒泡排序?哪种效率和速度好些呢?
其实要看场合,也就是看数据的储存环境。
一般数据是随机分散储存的,可以优先使用选择法。
如果数据是连续存储的,优先使用冒泡法。
冒泡排序:
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; }