闲来无事,看了一下二分法查找,就是折半查找。算法很简单,主要是针对已排好序的,故把以前写 的快速排序的代码拷过来了,我考虑的是降序的情况,升序的情况差不多,顺便写了个测试的程序, 随机生成数据,还有统计算法所用时间,以及将数据写入文件。关于时间统计,精确到毫秒级,用了 API函数GetLocalTime()。还有就是只粗略计算时间间隔,计算从小时开始的毫秒数,故在2天交替 时计算的时间不准了,且数据过少时,测试都是0毫秒。 #include <iostream> #include <iomanip> #include <fstream> #include <windows.h> #include <time.h> using namespace std; #define NUM 100 // 快速排序 void QuickDesc(int arr[], int start, int end); // 快速排序分治 int Partition(int arr[], int start, int end); // 二分法查找 int BinarySearch(int arr[], int len, int T); // 将当前时间从小时开始转换为毫秒数 long ToMilliseconds(SYSTEMTIME st); // 显示数组---每个元素占3位,每行10个 void show(int arr[], int len, bool sorted); int main() { // ------------------------统计时间 SYSTEMTIME systime; long nBegin = 0, nEnd = 0; int data[NUM] = {0}; // ------------------------随机生成数组 srand ((unsigned)time (NULL)); for (int i = 0; i < NUM; i++) { data[i] = rand() % 1000; } // ------------------------显示未排序前数组 show (data, NUM, false); // ------------------------快速法排序 GetLocalTime (&systime); nBegin = ToMilliseconds (systime); // 开始时毫秒数 QuickDesc (data, 0, NUM); // 排序 GetLocalTime (&systime); nEnd = ToMilliseconds (systime); // 结束时毫秒数 cout << "排序所用时间: " << nEnd - nBegin << " 毫秒" << endl; cin.get (); // ------------------------显示排序后数组 show (data, NUM, true); // ------------------------二分法查找 int nT = 0; cout << "请输入要查找的数(非数字退出):" << endl; while (cin >> nT) { cout << "数组中首位置: " << BinarySearch (data, NUM, nT) << endl; cout << "请输入要查找的数(非数字退出):" << endl; } system ("pause"); return 0; } // 快速排序 void QuickDesc(int arr[], int start, int end) { if(start < end) { int q = Partition(arr, start, end); // 分治的思想, // start至q是大于等于arr[start]的元素, // (q+1)至end是小于等于arr[start]的元素 QuickDesc(arr, start, q); QuickDesc(arr, q + 1, end); } } // 快速排序分治 int Partition(int arr[], int start, int end) { int x = arr[start]; int i = start - 1; int j = end + 1; while(1) // 一直到i>=j { do // 从后面找到第一个不小于x(即arr[start])的元素 { j--; }while(x > arr[j]); // 升序是 < do // 从后面找到第一个不大于x(即arr[start])的元素 { i++; }while(x < arr[i]); // 升序是 > if( i < j) { // 交换 arr[i] 、arr[j] int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } else { // 分堆放至置后中间的标志位(不是正中间) return j; } } } // 二分法查找 int BinarySearch(int arr[], int len, int T) { int low, high, mid; low = 0; high = len - 1; while (low <= high) { mid = (low + high) / 2; if (arr[mid] > T) { low = mid + 1; } else if (arr[mid] < T) { high = mid - 1; } else { return mid; } } return -1; } // 将当前时间从小时开始转换为毫秒数 long ToMilliseconds(SYSTEMTIME st) { long ms = 0; ms += ((((st.wHour * 60) + st.wMinute) * 60) + st.wSecond) * 1000 + st.wMilliseconds; return ms; } // 显示数组---每个元素占3位,每行10个 void show(int arr[], int len, bool sorted) { ofstream fout("data.txt", ios_base::out | ios_base::app); if (sorted) { fout << "排序后: " << endl; cout << "排序后: " << endl; } else { fout << "未排序前: " << endl; cout << "未排序前: " << endl; } for (int i = 0; i < len; i++) { fout << setw(3) << arr[i] << " "; cout << setw(3) << arr[i] << " "; if ((i + 1) % 10 == 0) { fout << endl; cout << endl; } } cout << endl; }