Java语言实现六种排序算法

版权声明:博主原创文章,转载注明出处! https://blog.csdn.net/xmh19936688/article/details/51916459

Java语言实现六种排序算法

下载完整源代码 (听说免积分哦)
C语言版点此穿越

冒泡排序

从左到右依次比较相邻两个元素,如果大的在左边则交换这两个元素。
如果在依次遍历中执行过交换操作,则再次遍历,直到不发生元素交换。

public static int[] sort(int[] num){
    int length=num.length;
    boolean flag=true;
    while(flag==true){
        flag=false;
        for(int i=0;i<length-1;i++){
            if(num[i]>num[i+1]){
                num[i]=num[i]+num[i+1]-(num[i+1]=num[i]);
                flag=true;
            }
        }
    }
    return num;
}

插入排序

从左到右遍历每个元素,遍历到的元素作为待定元素。
待定元素与其左边的元素逐个相比,如果左边大则交换,如果右边大则遍历下一个待定元素。

public static int[] sort(int[] num){
    for(int i=1;i<num.length;i++){
        for(int j=0;j<i;j++){
            if(num[j]>num[i]){
                num[i]=num[i]+num[j]-(num[j]=num[i]);
            }
        }
    }
    return num;
}

归并排序

如果被排序数组长度大于2,将要排序的数组从中间分为左右两组,分别递归执行归并排序,然后将排序后的两组有序数组进行排序合并。
如果被排序数组长度不大于2,则直接进行排序。

public static int[] sort(int[] num){
    sort(num,0,num.length-1);
    return num;
}

public static int[] sort(int[] num, int start,int end){
    int mid=(start+end)/2;
    if(start<end){
        sort(num,start,mid);
        sort(num,mid+1,end);
    }
    compare(num,start,mid,mid+1,end);
    return num;
}

public static int[] compare(int[]num,int start1,int end1,int start2,int end2){
    int[] temp=new int[end2+1];
    for(int i=start1;i<=end2;i++){
        temp[i]=num[i];
    }
    int point=start1;
    while(start1<=end1&&start2<=end2){
        if(temp[start1]<=temp[start2]){
            num[point]=temp[start1];
            point++;
            start1++;
        }else{
            num[point]=temp[start2];
            point++;
            start2++;
        }
    }
    while(start1<=end1){
        num[point]=temp[start1];
        start1++;
        point++;
    }
    while(start2<=end2){
        num[point]=temp[start2];
        point++;
        start2++;
    }
    return num;
}

快速排序

假设最左边元素作为核心元素。
从最右边遍历数组与核心元素相比,遇到比其小的则交换位置并终止遍历,或者直到遍历到核心元素终止遍历。
再从核心元素原位置向右进行遍历,遇到比其大的则交换位置并终止遍历,或者直到遍历到核心元素终止遍历。
重复上面两句直到遍历完整个数组,此时核心元素的位置已经确定。
对核心元素左边的数组递归执行快速排序,对核心元素右边的数组递归执行快速排序。

public static int[] sort(int[] num){
    sort(num,0,num.length-1);
    return num;
}

public static int[] sort(int[] num,int start,int end){
    if(start<end){
        int key=find(num,start,end);
        sort(num,start,key-1);
        sort(num,key+1,end);
    }
    return num;
}

public static int find(int[] num,int start,int end){
    int key=start;

    while(start<end){
        for(;end>start;end--){
            if(num[end]<num[start]){
                num[end]=num[end]+num[start]-(num[start]=num[end]);
                key=end;
                break;
            }
        }
        for(;start<end;start++){
            if(num[start]>num[end]){
                num[start]=num[start]+num[end]-(num[end]=num[start]);
                key=start;
                break;
            }
        }
    }

    return key;
}

希尔排序

定义数组长度为偏移量。
如果偏移量比大于等于1则将偏移量除以2。
从偏移量位置向右遍历数组,将遍历到的元素与其左边相差偏移量个单位的元素进行比较,如果左边的小则交换后继续与左边相差偏移量个单位的元素比较。
遍历完成后偏移量折半,重复上一句。

public static int[] sort(int[] num){
    int mid=num.length;
    while(mid/2>0){
        mid=mid/2;
        for(int i=mid;i<num.length;i++){
            int key=i;
            while((key-mid)>=0){
                if(num[key]<num[key-mid]){
                    num[key]=num[key]+num[key-mid]-(num[key-mid]=num[key]);
                }else{
                    break;
                }
                key-=mid;
            }
        }
    }

    return num;
}

选择排序

从左向右遍历数组,每个元素与其右边的所有元素相比,最小的放在所遍历的位置。

public static int[] sort(int[] num){
    for(int i=0;i<num.length;i++){
        for(int j=i+1;j<num.length;j++){
            if(num[i]>num[j]){
                num[i]=num[i]+num[j]-(num[j]=num[i]);
            }
        }
    }
    return num;
}

C语言版点此穿越

猜你喜欢

转载自blog.csdn.net/xmh19936688/article/details/51916459
今日推荐