筆者好長時間沒有更新部落格了,一個原因是開發的項目所用到的技術都是老技術點,所接觸到的知識都是行業邏輯流程,所以只是自己做了總結並沒有拿上來分享。另外一個原因是目前筆者在重新學習C++語言以及電腦的一些基本知識演算法等)。
下面的代碼為C++代碼,好了直接進入正題
折半尋找又稱二分尋找。
使用條件:有序集合。
演算法思想:先確定待查記錄所在的範圍區間),然後逐步縮小範圍直到找到或者不找到為止。
關鍵點在於比較中間位置所記錄的關鍵字和給定值的比較,如果比給定值大這裡假設集合從小到大排列)那麼可以縮小區間範圍集合開始-->中間位置的上一位),在比較該區間的中間位置所記錄的關鍵字與給定值,依次迴圈到找到或者找不到位置。
舉例編程:這裡有一個整數資料 int a[10]={1,5,10,13,17,23,65,77,81,93};
1)這是遞迴(感謝園友zdd指出這裡判斷條件的錯誤,應該改為if(min>max))
- //折半尋找
- //數組必須按照一定的順序
- //參數:最大,最小,目標參數類型為整數)
- int BinarySearch(int min,int max,int num)
- {
- if(min==max)return -1;
- int mid=(min+max)/2;
- if(a[mid]==num)return mid;
- else if(a[mid]
- {
- return BinarySearch(mid+1,max,num);
- }
- else
- {
- return BinarySearch(min,mid-1,num);
- }
- }
2)非遞迴
- //非遞迴演算法
- int BinarySearch_F(int num)
- {
- int min=0;
- int max=9;
- int mid;
- while(min<=max)
- {
- mid=(min+max)/2;
- if(a[mid]==num)return mid;
- else if(a[mid]>num)max=mid-1;
- else min=mid+1;
- }
- return -1;
- }
效能分析:時間複雜度O(logn)
插入排序
使用條件:可對比大小的集合。
演算法思想:將一個記錄插入到已排好序的有序列中,從而得到一個新的,記錄數增1的有序序列。待插記錄依次比較已經排好序列,如果序列數大於該待插記錄,那麼該序列往後挪一位,直到找到序列小於待插記錄,那麼此時插入到該序列的後一個位置,依次上面操作,直至插完位置。
舉例編程:int b[10]={77,1,65,13,81,93,10,5,23,17}將其排序
- //插入排序
- //這裡temp是哨兵位
- //從小到大
- void InsertSort()
- {
- int temp;
- int j;
- for(int i=1;i<10;i++)
- {
- temp=b[i];
- for(j=i-1;j>=0;j--)
- {
- if(b[j]>temp)
- {
- b[j+1]=b[j];
- }
- else
- {
- break;
- }
- }
- b[j+1]=temp;
- }
- cout<<"the sort is:";
- for(int i=0;i<10;i++)
- {
- cout<
- }
- cout<
- }
效能分析:時間複雜度On^2)
折半插入排序
使用條件:可對比大小的集合。
演算法思想:基本思想與簡單插入排序思想相似,唯一的不同點在於找出插入的位置,簡單插入排序用的是依次比較,這裡折半插入排序改進了,將依次尋找改進成折半尋找
舉例編程:int b[10]={77,1,65,13,81,93,10,5,23,17}將其排序
- void BinaryInsertSort()
- {
- int temp,min,max,mid;
- int j;
- for(int i=1;i<10;i++)
- {
- min=0;max=i-1;
- temp=b[i];
- while(min<=max)
- {
- mid=(min+max)/2;
- if(b[mid]>temp)
- {
- max=mid-1;
- }
- else
- {
- min=mid+1;
- }
- }
- for(j=i-1;j>=max+1;j--)
- {
- b[j+1]=b[j];
- }
- b[max+1]=temp;
- }
- cout<<"the sort is:";
- for(int i=0;i<10;i++)
- {
- cout<
- }
- cout<
- }
效能分析:時間複雜度On^2)
雖然這裡時間複雜度與簡單插入排序一樣,但是通過尋找找到插入的位置用的比較次數是明顯減少的。