查找和排序
来源:互联网 发布: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
- 排序和查找
- 字符串排序和查找
- 排序和查找
- 数据结构 排序和查找
- 查找和排序
- 查找和排序算法
- 查找和排序题目
- 排序和查找
- 排序和查找
- 查找和排序
- 查找和排序
- 排序和查找
- 二分排序和查找
- js排序和查找
- 查找和排序
- 排序和查找
- 算法--排序和查找
- php排序和查找
- R语言初识
- Android init.rc分析
- Jmeter之Http Cookie Manager
- 腾讯云Centos7系统mysql server安装
- 搭建FTP服务
- 查找和排序
- CSS(三)_表格,盒子模型,边框
- #479 – 对Canvas面板中的子元素使用布局转换(Using a Layout Transform on Child Elements in a Canvas)
- 报表在IBM AIX系统下resin部署
- ADT 安装不成功
- 安徽大学大一高数第三章答案
- 看到这些现象我们就应该考虑将其重构(一)
- C#动态调用C++编写的DLL函数
- B2B e-commerce search with Solr – product assortment and prices