几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)

Posted bloom_camellia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)相关的知识,希望对你有一定的参考价值。

以下为集中排序的java代码实现(部分是在引用别人代码):

插入排序(InsertSort):

//代码原理
public static void iSort(int[] a){
    for(int i = 1;i < a.length; i++){
        if(a[i] < a[i-1]){
            int temp = a[i];
            while(temp < a[i-1]){
                a[i] = a[i-1];
                if(i-1 > 0){
                    i--;
                }else{
                    break;
                }
            }
            a[i-1] = temp;
        }
    }
}
//精简代码1
public static void iSort2(int[] a){
        for(int i = 1;i < a.length; i++){
            if(a[i] < a[i-1]){
                int temp = a[i];
                while(temp < a[i-1]){
                    a[i] = a[i-1];
                    if(i-1 > 0){
                        i--;
                    }else{
                        break;
                    }
                }
                a[i-1] = temp;
            }
        }
    }
//精简代码2
for(current=1;current<=arr.length-1;current++){
    //每当current变化,key和before都随之变化
    key = arr[current];
    before = current-1;//红色有序索引第一个值。
    
    while(before>=0 && arr[before]>key){
                
        arr[before+1] = arr[before];//大值向后移一位
        before--;
    }
    
    //插入点:before+1
    arr[before+1] = key;
}

 

冒泡排序(BubbletSort):

public class BubbleSort {
    public static int[] bSort(int[] a){
        for(int j = a.length-1; j >= 1; j--){
//            如果flag没有变为false那么证明数组本身有序
            boolean flag = true;
            for(int i = 0; i <= j-1; i++){
                if(a[i] > a[i+1]){
                    int temp = a[i];
                    a[i+1] = a[1];
                    a[i] = temp;
                    flag = false;
                }
            }
            if(flag)
                break;
        }
        return a;
    }
}

 

选择排序(SelectionSort):

/*
 * 选择排序基本思路:
 * 把第一个元素依次和后面的所有元素进行比较。
 * 第一次结束后,就会有最小值出现在最前面。
 * 依次类推
 */
public class SelectionSort {
    public static void sort(int[] data) {
        for (int x = 0; x < data.length - 1; x++) {
            for (int y = x + 1; y < data.length; y++) {
                if (data[y] < data[x]) {
                    SortTest.swap(data, x, y);
                }
            }
        }
    }
}

 

选择排序(QuickSort):

/**
 * 快速排序
 * @author mly11
 *
 */
public class QuickSort {
    static int low = 0;
    static int high = 0;
    static int mid = 0;
    public static void main(String[] args) {
        int[] arr = {5,1,3,9,2,7,2,4};
        
//        开始的数组为
        System.out.println("开始的数组为:");
        for(int i = 0; i < arr.length; i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();

//        排序
        judge(arr);
        
//        排序后遍历
        System.out.println("排序后数组为:");
        for(int i = 0; i < arr.length; i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }
    
//    判断数组是否为空
    public static void judge(int[] arr){
        if(arr.length > 0){
            all(arr,0,arr.length-1);
        }else{
            System.out.println("换个吧");;
        }
    }
    
//    循环条件,递归调用循环体
    public static void all(int[] arr,int low,int high){
        if(low < high){
//            用mid记录每一次选择的分界数字的角标,
            mid = structure(arr, low, high);
            
//            当low < mid -1的时候,从low到mid-1进行递归
            if(low < mid - 1){
                all(arr, low, mid-1);
            }
            
//            当high>mid+1时候,从mid+1到high递归
            if(high > mid +1){
                all(arr, mid+1, high);
            }
        }
    }
    
//    循环体   一次循环
    public static int structure(int[] arr,int low,int high){
//        当索引low小于high时,进行运算,让小于所选值在左边,否则在右边
/*        原理:
        取出a[low]的数据存入temp,使a[low]为空;开始循环:
        当low < high 时,一直循环
        while(low < high){
            当low从第一个开始时,从后向前一一查找,如果比temp大,则high--;
            否则交换a[low]和a[high],此时a[low]的值为a[high],a[high]为空;
            现在从前(a[low]被a[high]占据的位置)向后查找,如果比temp小,则low++;
            否则将a[low]的位置存入a[high](上一步为空的a[high]),此时a[low]为空;
        }
        a[low] = temp;
        返回low,此时low的位置之前数据全部<a[low],low之后的位置的数据全部>a[low];
*/
        
        int temp = arr[low];
        while (low < high) {
            while (low < high && arr[high] >= temp) {
                high--;
            }
            arr[low] = arr[high];
            while (low < high && arr[low] < temp) {
                low++;
            }
            arr[high] = arr[low];
        }
        arr[low] = temp;
        return low;    
        
/*错误的方法
    while(low < high){
            int temp = arr[low];
            while(arr[low] <= arr[high]){
                high--;
            }
            arr[low] = arr[high];
            low++;
            arr[high] = arr[low];
            arr[low] = temp;
        }
        return low;*/
    }
    
}

以上代码为自己在最开始接触的时候写的,不足之处请谅解。

以上是关于几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)的主要内容,如果未能解决你的问题,请参考以下文章

js算法初窥01(排序算法01-冒泡选择插入)

几种排序算法及Java实现排序的几种方式

Java中的几种排序算法

Java中的几种排序算法:冒泡排序,插入排序,二分法排序,简单排序,快速排序

Java实现几种常见排序方法

Java实现几种排序