最近總是在想著,如何去設計,如何更好的編碼,更充分地體會面向對象的思想,也刻意往這方面去學習。寫了幾年代碼,也改總結總結,發現最重要的還是在與思考。重溫了一下《程序設計實踐》這本書,進一步規范反思下自己寫的代碼風格、質量、性能、可移植性等(想起來斯坦福教授講二分的時候直接撕字典了=>=)。對了數據結構這方面的知識與算法進一步鞏固。下面寫筆試經常遇見的算法:二分法查找、快速排序算法。實現算法其關鍵在于實現的思想。
(一)二分法查找
二分法查找其實就是折半查找,一種效率較高的查找方法。針對有需數組來查找的。
主要思想是:(設查找的數組期間為array[low, high])
(1)確定該期間的中間位置K
(2)將查找的值T與array[k]比較。若相等,查找成功返回此位置;否則確定新的查找區域,繼續二分查找。區域確定如下:
a.array[k]>T 由數組的有序性可知array[k,k+1,……,high]>T;故新的區間為array[low,……,K-1]
b.array[k]
時間復雜度:O(log2n);
代碼實現:
///
/// 二分法查找
///
/// 目標數組(已經排序好了)
/// 查找的數
/// 目標數的索引
public int BinarySearch(int[] array, int T)
{
int low, high, mid;
low = 0;
high = array.Length - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (array[mid] < T)
{
low = mid + 1;
}
else if (array[mid]>T)
{
high = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
(二)快速排序算法
快速排序是盡量避免額外計算的極好例子.其工作方式是在數組中劃分出小的和大的元素
基本思想是:
從數組中取出一個元素作為基準值
把其他元素分為兩組:
“小的”是那些小于基準值的元素。
“大的”是那些大于基準值的元素,
遞歸對這兩個組做排序。
快速排序快速的原因在于:一旦知道了某個元素比基準值小,它就不需要在與那些大的元素比較。而大的元素也不需要在與小的元素比較,這個性質使快速排序比簡單排序、冒泡排序快的多。
時間復雜度:O(nlogn)
代碼實現:
///
/// 快速排序
///
///
///
///
public void QuickSort(int[] array,int left,int right)
{
int last;
if (left>=right)
return;
int rand = (left+right)/2;
Swap(array, left, rand);
last = left;
for (int i = left + 1; i <= right; i++)
{
if (array[i] < array[left])
Swap(array, ++last, i);
}
Swap(array, left, last);
QuickSort(array, left, last - 1);
QuickSort(array, last + 1, right);
}
///
/// 交換兩個值
///
///
///
///
private void Swap(int[] a,int i,int j)
{
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}