zoukankan      html  css  js  c++  java
  • 排序和查找


    //
    Function.h void bubble_sort(int Array[],int N);//冒泡排序 void Quick_sqort(int Arr[],int begin,int end);//快速排序 void selection_sort(int Array[],int N);//选择排序 void heap_sort(int *array, int n);//堆排序 void merge_sort(int Arr[],int begin,int end);//归并排序 int binary_search(int Array[],int N,int num);//二分查找
    //Main.cpp
    #include<stdio.h>
    #include"Function.h"
    int main()
    {
        int Array[1000]={0};
        int N,k,index;
        int i;
        printf("请输入待排序数字个数:"); scanf("%d",&N);
        printf("请输入待排序数字:");
        for(i=0;i<N;i++)
            scanf("%d",&Array[i]);
    
        /////排序(从小到大)
        //bubble_sort(Array,N);
        Quick_sqort(Array,0,N-1);
        //selection_sort(Array,N);
        //merge_sort(Array,0,N-1);
        //heap_sort(Array, N);
        printf("排序过后的数字:");
        for(i=0;i<N;i++)
           printf("%d ",Array[i]);
        /////////
    
        printf("\n请输入待查找的数字:");scanf("%d",&k);
        index=binary_search(Array,N,k);//升序数组Array[]中二分搜索
        if(index>0)
            printf("这是第%d个数\n",index+1);
        else printf("没有该数字");
    
        return 0;
    }
    #include"Function.h"
    void bubble_sort(int Array[],int N)//冒泡排序(升序)
    {
        int i,j,temp;
        for(i=0;i<N;i++)//第i次起泡,共起泡N次
        {
            for(j=1;j<N-i;j++)//第i次将最大数起泡到Array[N-i-1]
               if(Array[j-1]>Array[j])//若能,每次相邻比较后,将较大数冒泡到Array[j]
               {
                   temp=Array[j-1];
                   Array[j-1]=Array[j];
                   Array[j]=temp;
               }
        }
    }
    #include"Function.h"
    //快速排序
    int partition(int Arr[],int be,int en)//选取极端的测例:5 4 3 2 1 排成小到大
    {
       int i,j;
       int temp;
       i=be+1;//枢轴在be位置
       j=en;
       while(i<=j)//注意"<="而不是"<"//当i==j时说明该次划分只剩两个数,还得继续划分(定位j),否则while之后的代码会打乱排好的序
       {      
           //be元素是枢轴,在[be+1~en]范围内搜索
           while(i<=en &&Arr[i]<=Arr[be])   i++;//从i位置开始找到比枢轴Arr[be]大的         
           while(j> be &&Arr[j]>=Arr[be])   j--;//从j。。。。。。。。。。。。 小的
           if(i<j)///两头大小互换///
           {   temp=Arr[i];
               Arr[i]=Arr[j];
               Arr[j]=temp;
           }
       }   
       temp=Arr[be];      //当i>j,i总会在跑到第一个Arr[i]>Arr[begin]处停下来或到en+1(出范围[be+1~en])
       Arr[be]=Arr[j];    //      j总会在跑到第一个Arr[j]<Arr[begin]处停下来或到be  (出范围[be+1~en])
       Arr[j]=temp;       //与枢轴交换的是Arr[j],必须保证j的安全([be~en]内)
       
       return j;//新的枢轴下标
    }
    void Quick_sqort(int Arr[],int begin,int end)
    {
        if(begin<end)//待排序数列:起点下标>=终点下标,不再划分
        {
             int mid=partition(Arr,begin,end);
             Quick_sqort(Arr,begin,mid-1);
             Quick_sqort(Arr,mid+1,end);
        }
    }
    #include"Function.h"
    void selection_sort(int Array[],int N)//选择排序(升序)
    {
        int i,j,k,temp;
        for(i=0;i<N;i++)//为下标为i的数组元素寻找最小值(i及i之后部分中)
        {
            k=i;//k用于标记当前一轮中最小值的下标
            for(j=i+1;j<N;j++)
                if(Array[j]<Array[k])    k=j;
            temp=Array[i];
            Array[i]=Array[k];
            Array[k]=temp;    
        }
    }
    #include"Function.h"
    //堆排序
    //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度
    //本函数功能是:根据数组array构建大根堆
    void HeapAdjust(int array[], int i, int nLength)
    {
        int nChild;
        int nTemp;
        for (nTemp=array[i]; 2*i+1<nLength; i=nChild)
        {
            //子结点的位置=2*(父结点位置)+1
            nChild=2*i+1;
            //得到子结点中较大的结点
            if (nChild<nLength-1 &&array[nChild + 1]>array[nChild])
                ++nChild;
            //如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
            if(nTemp<array[nChild])
            {
                array[i]=array[nChild];
                array[nChild]= nTemp;
            }
            else// 否则退出循环
                break;
        }
    }
    void heap_sort(int array[],int length)// 堆排序算法
    {  
        int tmp,i;
        // 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
        //length/2-1是第一个非叶节点,此处"/"为整除
        for (i=(length-1)/2; i>=0; --i)
            HeapAdjust(array, i, length);
        //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
        for (i=length-1; i>0; --i)
        {
            // 把第一个元素和当前的最后一个元素交换,
            // 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
            // Swap(&array[0], &array[i]);
               tmp = array[i];
               array[i] = array[0];
               array[0] = tmp;
            //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
            HeapAdjust(array, 0, i);
        }
    }
     
    #include"Function.h"
    //归并排序(升序)
    void merge(int Arr[],int begin,int mid,int end)//合并
    {
        int i,j,k=0;
        int List[1000]={0};//临时数组
        for(i=begin,j=mid+1; i<=mid&&j<=end;)//限定范围i-[begin~mid],j-[mid+1~end]
            if(Arr[i]<Arr[j])    List[k++]=Arr[i++]; //挑选较小者入List[]
            else   List[k++]=Arr[j++]; 
        //条件i<=mid&&j<=end不再满足
        while(i<=mid)
             List[k++]=Arr[i++]; 
        while(j<=end)
             List[k++]=Arr[j++]; 
    
        k=0;
        for(i=begin; i<=end; i++)
            Arr[i]=List[k++];//临时数组中数据回存Arr[]数组
    }
    
    void merge_sort(int Arr[],int begin,int end)//归并排序(递归:不断调用自身)
    {
        int mid;
        if(begin<end)
        {  
            mid=(begin+end)/2;//划分
            merge_sort(Arr,begin,mid);
            merge_sort(Arr,mid+1,end);
            merge(Arr,begin,mid,end);//合并
        }
    }
    #include"Function.h"
    int binary_search(int Array[],int N,int num)//二分查找
    {
        int low,high,mid;
        low=0;
        high=N-1;   
        while(low<=high)
        {
             mid=(low+high)/2;
             if(Array[mid]==num)///查找到num 
                 return mid;
             else if(Array[mid]>num)
                 high=mid-1;
             else low=mid+1;
        }
        return -1;//未找到
    }
  • 相关阅读:
    android布局几点随想
    android_handler(一)
    android surfaView surfaHolder video 播放
    java_synchronized 用法
    android_viewFlipper(一)
    android_handler(二)
    解析pdf文档 (lucene3.5)
    Lucene 搜索(小程序)(Lucene3.5)
    运算符重载(++,<<,>>Data类的重载)
    线程池小程序(Java)
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2732923.html
Copyright © 2011-2022 走看看