您的位置:首页 > 编程语言 > Java开发

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

2017-05-01 21:07 288 查看
/**

     * 迭代的对序列中的元素进行比较,需要就交换

     * 没有交换操作就意味着排序完成

     * @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;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐