赞
踩
数据结构再往后就是比较零散的各种操作,查找与排序是其中最常出现的,今天来总结一下常用的查找与排序所用的方法
- bool search1(int *a,int n,int k){
- for (int i=1;i<n;i++){//遍历
- if (a[i]==k) {//比较
- return true;
- break;
- }
- }
- return false;
- }
遍历时对数据i是否越界的判断可以使用哨兵优化掉
- int search1(int *a,int n,int k){
- a[0]=key;//哨兵
- while(a[n]!=key){
- n--;
- }
- return n;//找到返回位置,找不到返回0
- }
- //二分查找
- int binarysearch(int *a,int n,int k){
- int l,r,m;
- l=1;//左指针指向一查找的数组范围的左边
- r=n;//右指针
- while(l<=r){
- m=(l+r)/2;
- if (a[m]==k) return m;//如果相等,返回找到的位置
- else if(a[m]>k) r=m-1;//在左边进行查找
- else l=m+1;//在右边查找
- }
- return 0;
- }
- //插值查找
- int intersearch(int* a,int n,int k){
- int l,r m;
- l=1;
- r=n;
- while(l<=r){
- m=l+(r-l)*(k-a[l])/(a[r]-a[l]);
- if (a[m]==k) return m;//如果相等,返回找到的位置
- else if(a[m]>k) r=m-1;
- else l=m+1;
- }
- return 0;
- }
- //斐波那契查找
- //f[k]为斐波那契数列
- int fibosearch(int* a,int n,int k){
- int l,r,m;
- l=1;
- r=n;
- while(n>f[k]-1){
- k++;
- }
- for (int i=n;i<f[k]-1;i++){//补全a数组,将最大的数补到a数组后面
- a[i]=a[n];
- }
- while(l<=r){
- m=l+f[k-1]-1;
- if (a[m]==k) {
- if (m>n) return n;//m大于n,说明是补全的数字中的值与目标值相等,返回最大值
- else return m;
- }
- else if(a[m]>k){//此时去左边查找,新数列的总长度为f[k-1]-1个
- r=m-1;
- k--;
- }
- else {//此时去右边查找,新数列的总长度为f[k-2]-1个
- l=m+1;
- k-=2;
- }
- }
- return 0;
- }
- bool search(BinaryTree* T,int key) {
- if (!T) {
- return false; //树为空
- } else if (key==T->data) {
- return true;//查找成功
- } else if (key<T->data) {
- return search(T->leftchild,key); //继续在左子树中查找
- } else {
- return search(T->rightchild,key); //向在右子树中查找
- }
- }
- void inserSort(int*a,int n) {
- for (int i=1;i<n;i++) {//从第二个元素开始比较,找合适的位置插入
- int k=a[i];
- int j=i-1;
- // 将a[i]插入到已排序序列数组中
- while (j>=0&&a[j]>k) {
- a[j+1]=a[j];
- j--;
- }
- a[j+1]=k;
- }
- }
- void bubbleSort(int *a, int n) {
- for (int i=0; i<n-1; i++) {
- for (int j=0; j<n-i-1; j++) {
- if (a[j]>a[j+1]) {//顺序不对则交换
- int temp=a[j];
- a[j]=a[j+1];
- a[j+1]=temp;
- }
- }
- }
- }
- void shellSort(int *a, int n) {
- for (int gap=n/2;gap>0;gap/=2) {//对不同步长进行排序(即不同长度子序列)
- for (int i=gap; i<n; i++) {
- int temp=a[i];//记录当前元素
- int j;
- for (j=i;j>=gap&&a[j-gap]>temp;j-=gap) {
- a[j]=a[j-gap];//往后移动元素
- }
- a[j]=temp;//插入到正确位置
- }
- }
- }
- int partition(int*nums,int low,int high) {
- int pivot=nums[low];//选择第一个元素为基准元素
- while (low<high) {
- // 从右向左找到小于基准元素的值
- while (low<high&&nums[high]>=pivot)
- high--;
- nums[low]=nums[high];//将找到的小于基准元素的值放到左边
- // 从左向右找到大于基准元素的值
- while (low<high&&nums[low]<=pivot)
- low++;
- nums[high]=nums[low];//将找到的大于基准元素的值放到右边
- }
- nums[low]=pivot;
- return low;
- }
- void qsort(int*nums,int low,int high) {
- if (low<high) {
- int pos=partition(nums,low,high);//获取基准元素位置
- qsort(nums,low,pos-1);//对左半进行排序
- qsort(nums,pos+1,high);//对右半进行排序
- }
- }
(c++有堆形数据结构的相关函数,使用其排序较为方便)
- void print(const vector<int>& a) {//输出排序好的元素
- for (int i=0;i<a.size();i++)
- cout<<a[i]<<" ";
- cout<<endl;
- }
- // 堆排序
- void heapSort(vector<int>& a) {
- make_heap(a.begin(),a.end());//默认构建最大堆,最小堆需要自定义比较函数
- for (int i=a.size()-1;i>0;i--) { //依次取出堆顶元素,进行排序
- pop_heap(a.begin(),a.begin()+i+1);//将当前堆顶元素(最大值)与数组末尾元素交换
- swap(a[0],a[i]);
- push_heap(a.begin(),a.begin()+i);//调整剩余元素构建最大堆
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。