随手记录--java排序(1)冒泡、选择、希尔、归并

来源:互联网 发布:php工程师需要具备 编辑:程序博客网 时间:2024/06/05 22:34
/**
     * 迭代的对序列中的元素进行比较,需要就交换
     * 没有交换操作就意味着排序完成
     * @param A
     * @param n 
     */
    void BubbleSort(int A[],int n){
        int pass,i,temp,swapped=1;
        for(pass=n-1;(pass>=0) || (swapped!=0);pass--){
            swapped=0;
            for(i=0;i<pass-1;i++){
                if(A[i]>A[i+1]){
                    temp=A[i];
                    A[i]=A[i+1];
                    A[i+1]=temp;
                    swapped=1;
                }
            }
            
        }        
    }
    //选择排序是原地排序算法,适用于小文件,优点:容易实现,不需要额外空间
    //缺点,扩展性差
    void Selection(int a[],int n){
        int i,j,min,temp;
        for (i = 0;  i< n-1; i++) {
            min=i;
            for(j=i+1;j<n;j++){
                if(a[j]<a[min]){
                    min=j;
                }
                temp=a[min];
                a[min]=a[i];
                a[i]=temp;
            }
        }
    }
    /**
     * 插入排序
     * 迭代地随机的从序列中读取操作并插入待排序序列
     *优点:实现简单,不需要额外辅助空间,
    */
    void InsertSort(int a[],int n){
        int i,j,v;
        for(i=2;i<n-1;i++){
            v=a[i];
            j=i;
            while(a[j-1]>v && j>=1){
                a[j]=a[j-1];
                j--;
            }
            a[j]=v;
        }
    }
    
    
    /**
     * 希尔排序,即缩小增量排序,也称n间距插入排序
     * 比较和交换数组中每个距离为h的元素,然后h--
     * 小列表适合
     */
    void ShellSort(int a[],int size){
        int i,j,h,v;
        for(h=1;h <=(size/9);h = 3*h + 1);
        for( ; h>0 ;h=h/3){
            for(i=h+1;i<=size;i+=1){
                v=a[i];
                j=i;
                while(j>h && a[j-h]>v){
                    a[j]=a[j-h];
                    j-=h;
                    a[j]=v;
                }
            }
        }
    }
    
    /**
     * 归并排序,分治
     * 归并:把两个已排序的合并乘更大的已排序的
     * 选择:把文件分层包含k个最小元素和n-k个最大元素
     * 
     */
void mergeSort(int a[],int temp[],int left,int right){
    int mid;
    if(right > left){
       mid=(right+left)/2;
       mergeSort(a,temp,left,mid);
       mergeSort(a,temp,mid+1,right);
       merge(a,temp,left,mid+1,right);
    }
    }
void merge(int a[],int temp[],int left,int mid,int right){
    int i,left_end,temp_pos,size;
    left_end=mid-1;
    temp_pos=left;
    size=right-left+1;
    while((left<=left_end)&&(mid<=right)){
        if(a[left]<=a[mid]){
            temp[temp_pos]=a[left];
            temp_pos=temp_pos+1;
            left=left+1;
        }else{
            temp[temp_pos]=a[mid];
            temp_pos=temp_pos+1;
            mid=mid+1;
        }
    }
    while(left<=left_end){
        temp[temp_pos]=a[left];
        left=left+1;
        temp_pos=temp_pos+1;
    }
    while(mid<=right){
        temp[temp_pos]=a[mid];
        mid=mid+1;
        temp_pos=temp_pos+1;     
    }
    for(i=0;i<=size;i++){
        a[right]=temp[right];
        right=right-1;
    }
}
0 0
原创粉丝点击