• 直通BAT面试算法精讲课2


    对于一个int数组,请编写一个冒泡排序算法,对数组元素排序。

    给定一个int数组A及数组的大小n,请返回排序后的数组。 

    测试样例:
    [1,2,3,5,2,3],6
    [1,2,2,3,3,5]
    冒泡: 依次比较相邻,大的放后面。
    class BubbleSort {
    public:
        int* bubbleSort(int* A, int n) {
            // write code here
            for(int i=0;i<n;i++){
                for(int j=i+1;j<n;j++){
                    if(A[i]>A[j]){
                        swap(A[i],A[j]);
                        
                    }
                } 
            }
            return A;
        }
    };
    class BubbleSort {
    public:
        int* bubbleSort(int* A, int n) {
            // write code here
            for(int i=0;i<n;i++){
                for(int j=n-1;j>i;j--){
                    if(A[j]<A[j-1]){
                        int tmp = A[j];
                        A[j]=A[j-1];
                        A[j-1]=tmp;
                    }
                }
            }
            return A;
        }
    };
    View Code
    class BubbleSort {
    public:
        int* bubbleSort(int* A, int n) {
            int i,j;
            for(i=0;i<n-1;i++){
                for(j=i+1;j<n;j++)
                    {
                    if(A[i] > A[j])
                        {
                        int temp = A[i];
                        A[i] = A[j];
                        A[j] = temp;
                    }
                }
            }
             
              return A;  
       
            // write code here
        }
    };
    View Code

     选择:选择最小放第一,第二小放第二。

    class SelectionSort {
    public:
        int* selectionSort(int* A, int n) {
            // write code here
            for(int i=0;i<n-1;i++){
                int minIndex=i;
                for(int j=i+1;j<n;j++){
                    if(A[j]<A[minIndex]){
                        minIndex=j;
                    }
                }
                if(minIndex!=i){
                    int temp=A[i];
                    A[i]=A[minIndex];
                    A[minIndex]=temp;
                }         
            }
            return A;
        }
    };
    View Code
    class SelectionSort {
    public:
        int* selectionSort(int* A, int n) {
            // write code here
            
            for(int i=0; i<n; i++){
                int min = A[i];
                int idx = i;
                for(int j=i+1;j<n;j++){
                    if(A[j]<min){
                        min = A[j];
                        idx = j;
                    }  
                }
                if(idx != i)
                   swap(A[i],A[idx]);
            }
            return A;
        }
    };

     插入: 从第二个开始,小于就交互, 内部维护一个冒泡。

    class InsertionSort {
    public:
        int* insertionSort(int* A, int n) {
            // write code here
            for(int i=1;i<n;i++){
                for(int j=i-1; j>=0; j--){  
                    if(A[j+1]<A[j]){
                        swap(A[j+1],A[j]);
                    }
                }
            }
            return A;
            
            
        }
    };

    归并排序: 本质上是一个递归的调用。 递归拆分然后合并。每个归并的子集都是有序的。

    class MergeSort {
    public:
        int* mergeSort(int* A, int n) {
            // write code here
            if( n==1){
                return A;
            }
            __mergeSort(A,0,n-1);
            return A;
        }
        //[l,r]
        void __mergeSort(int* A,int l,int r){
            if(l>=r){
                return;
            }
            int mid = (l+r)/2;
            __mergeSort(A,l,mid);
            __mergeSort(A,mid+1,r);
            __merge(A,l,mid,r);
              
        }
        //将[l ,mid] [mid,r]进行归并
        void __merge(int* A, int l,int mid,int r){
            int aux[r-l+1];  //使用临时变量记录数据。
            for (int i=l; i<=r; i++){
                aux[i-l] = A[i];
            }
            
            int i=l; int j = mid + 1;
            for(int k =l;k<=r; k++ ){
                if(i>mid){
                    A[k]=aux[j-l];  //留意l的偏移量。
                    j++;
                }else if(j>r){
                    A[k] = aux[i-l];
                    i++;
                }
                else if(aux[i-l]<aux[j-l]){
                    A[k]= aux[i-l];
                    i++;
                }else{
                    A[k]= aux[j-l];
                    j++;
                }
            }
        }
    };

     快速排序

    // 对arr[l...r]部分进行partition操作
    // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
    template <typename T>
    int __partition(T arr[], int l, int r){
    
        T v = arr[l];
    
        int j = l; // arr[l+1...j] < v ; arr[j+1...i) > v
        for( int i = l + 1 ; i <= r ; i ++ )
            if( arr[i] < v ){
                j ++;
                swap( arr[j] , arr[i] );
            }
    
        swap( arr[l] , arr[j]);
    
        return j;
    }
    
    // 对arr[l...r]部分进行快速排序
    template <typename T>
    void __quickSort(T arr[], int l, int r){
    
        if( l >= r )
            return;
    
        int p = __partition(arr, l, r);
        __quickSort(arr, l, p-1 );
        __quickSort(arr, p+1, r);
    }
    
    template <typename T>
    void quickSort(T arr[], int n){
    
        __quickSort(arr, 0, n-1);
    }
  • 相关阅读:
    How To Upgrade ASM from 10.2 to 11.1 (RAC)
    Moving ASM spfile to a shared device in RAC
    关于2019夏季小学期收获与感想
    大道至简读后感
    关于2017届学长制作分享软件share(失物招领)的使用体验和需改进的内容
    暑假周报告总结第三周
    暑假周报告总结第二周
    假期周进度报告第一周
    成功试验基于C#/.NET的Android开发
    基于Linux命令行终端的ftp客户端程序
  • 原文地址:https://www.cnblogs.com/yuguangyuan/p/6127748.html
Copyright © 2020-2023  润新知