查找和排序

来源:互联网 发布:2017年淘宝双十一晚会 编辑:程序博客网 时间:2024/05/17 04:50

    查找和排序都是在程序设计中经常用到的算法。对于查找最基本的查找为二分查找,对于排序要掌握归并和快速排序。

   一.二分查找

 (1)递归方法

//递归方法的实现方式int BinSearch(int Array[],int low,int high,int key/*要找的值*/)  {      if (low<=high)      {          int mid = (low+high)/2;          if(key == Array[mid])              return mid;          else if(key<Array[mid])              return BinSearch(Array,low,mid-1,key);          else if(key>Array[mid])              return BinSearch(Array,mid+1,high,key);      }      else          return -1;  }  
 (2)非递归的实现方式

//非递归的实现方法int BinSearch(int Array[],int SizeOfArray,int key/*要找的值*/)  {      int low=0,high=SizeOfArray-1;      int mid;      while (low<=high)      {          mid = (low+high)/2;          if(key==Array[mid])              return mid;          if(key<Array[mid])              high=mid-1;          if(key>Array[mid])              low=mid+1;      }      return -1;  }  
二.快速排序

     快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小小的程序方面的考试如软考,考研中也常常出现快速排序的身影。

(1)递归实现

//快速排序  void quick_sort(int s[], int L, int r)  {      if (L < r)      {          //Swap(s[L], s[(L + r) / 2]); //将中间的这个数和第一个数交换 参见注1          int i = L, j = r, x = s[L];          while (i < j)          {              while(i < j && s[j] >= x) // 从右向左找第一个小于x的数                  j--;                if(i < j)                   s[i++] = s[j];                            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数                  i++;                if(i < j)                   s[j--] = s[i];          }          s[i] = x;          quick_sort(s, L, i - 1); // 递归调用           quick_sort(s, i + 1, r);      }  }  

三.归并排序

(1)合并有序的数列

//将有序数组a[]和b[]合并到c[]中  void MemeryArray(int a[], int n, int b[], int m, int c[])  {      int i, j, k;        i = j = k = 0;      while (i < n && j < m)      {          if (a[i] < b[j])              c[k++] = a[i++];          else              c[k++] = b[j++];       }        while (i < n)          c[k++] = a[i++];        while (j < m)          c[k++] = b[j++];  }  
(2)一般归并算法的思想:可以将A,B组各自再分成二组,依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递的分解数列,再合数列就完成了归并排序。

//将有二个有序数列a[first...mid]和a[mid...last]合并。  void mergearray(int a[], int first, int mid, int last, int temp[])  {      int i = first, j = mid + 1;      int m = mid,   n = last;      int k = 0;            while (i <= m && j <= n)      {          if (a[i] <= a[j])              temp[k++] = a[i++];          else              temp[k++] = a[j++];      }            while (i <= m)          temp[k++] = a[i++];            while (j <= n)          temp[k++] = a[j++];            for (i = 0; i < k; i++)          a[first + i] = temp[i];  } //递归实现归并排序 void mergesort(int a[], int first, int last, int temp[])  {      if (first < last)      {          int mid = (first + last) / 2;          mergesort(a, first, mid, temp);    //左边有序          mergesort(a, mid + 1, last, temp); //右边有序          mergearray(a, first, mid, last, temp); //再将二个有序数列合并      }  }  //归并排序的调用函数bool MergeSort(int a[], int n)  {      int *p = new int[n];      if (p == NULL)          return false;      mergesort(a, 0, n - 1, p);      delete[] p;      return true;  }  
总结:根据具体的问题选取不同的排序和查找算法才是关键,比如查找:哈希表和二叉排序树,时间快。排序也有插入排序、冒泡排序、归并排序、快速排序的不同的排序算法,每个算法的运用场景有所不同。



0 0
原创粉丝点击