手写常见排序算法(冒泡排序,选择排序,插入排序,快速排序)

手写常见排序算法   

1.交换函数(异或运算写法)

因为要写常用排序,所以肯定会用到交换函数,下面就是交换函数的一种位运算写法(给新手小白的说明,老手勿看)

对应的贴图版本:手写常见排序算法(冒泡排序,选择排序,插入排序,快速排序) 贴图板

public class Algorithm {

public static void swap(int[] arr, int i, int j){

    if (i != j){  //防止交换地址相同的数据 (地址相同的数据 在进行异或运算时 会变成0)

        //异或运算  实现交换(不用开辟额外空间,位运算速度较快)

        //可以这么理解 已知  a = arr[i]    b = arr[j]  ,因为 是异或操作所以有这些结论 :a ^ a =0 ,  a ^ 0 = a ,  b ^ b = 0  ,b ^ 0 = b

        arr[i]  = arr[i] ^ arr[j];    //相当于 a =  a^b

        arr[j] = arr[i] ^ arr[j];      //相当于 b =  (a^b) ^ b  因为: 异或操作满足结合律,所以:b = a^(b^b)  ;又因为 b^b = 0; 所以:b = a ^ 0;又因为:a ^ 0 = a 所以:b = a;

        arr[i] = arr[i] ^ arr[j]      //相当于 a = (a^b)    ^    (  (a^b)^b  )  所以这也就相当于 a = (a^b)  ^ a; 同理因为: 异或操作满足交换律 所以:a =  (b^a) ^ a ;又因为 异或操作满足结合律 ,所以:a = b ^(a^a);又因为 a^a = 0; 所以 a= b^ 0;又因为:b^0 =b 所以: a = b;

        以上就是交换函数原理

    }

}

2.冒泡排序,选择排序,插入排序,快速排序的写法

public class algorithm {

    //冒泡排序

    public static void bubblingSort(int[] arr){

        for(int i = 1; i < arr.length; i++){

            for(int j = 0; j < arr.length - i; j++){

                if(arr[j] > arr[j+1]){

                    swap(arr,j,j+1);

                }

            }

        }

    }

    //选择排序

    public static void selectSort(int[] arr){

        for(int i = 1; i < arr.length; i++){

            int maxIndex = arr.length-i;

            for (int j = 0; j < arr.length - i; j++){

                maxIndex = arr[j] > arr[maxIndex] ? j : maxIndex;

            }

            swap(arr,maxIndex,arr.length-i);

        }

    }

    //插入排序

    public static void insertSort(int[] arr){

        for(int i = 1; i < arr.length; i++){

            for(int j = i; j > 0 && arr[j] < arr[j-1]; j--){

                swap(arr,j,j-1);

            }

        }

    }

    //快速排序

    public static void quickly(int[] arr, int leftIndex, int rightIndex){

        if(leftIndex >= rightIndex){

            return;

        }

        int left = leftIndex;

        int right = rightIndex;

        int norm = arr[right];

        while(left < right){

            while (left < right && arr[left] <= norm){

                left++;

            }

            arr[right] = arr[left];

            while (right < left && arr[right] >= norm){

                right--;

            }

            arr[left] = arr[right];

        }

        arr[right] = norm;

        quickly(arr,right + 1, rightIndex);

        quickly(arr, leftIndex, left - 1);

    }

    //交换函数

    public static void swap(int[] arr, int i, int j){

        if(i != j){

            arr[i] = arr[i] ^ arr[j];

            arr[j] = arr[i] ^ arr[j];

            arr[i] = arr[i] ^ arr[j];

        }

    }

    //测试主函数

    public static void main(String[] args){

        int[] arr = {0,1,1,5,24,25,56,85,647,8536,7445,89,644,0};

        //bubblingSort(arr);

        //quickly(arr,0,arr.length - 1);

        //insertSort(arr);

        selectSort(arr);

        for (int i : arr){

            System.out.println("i = " + i);

        }

    }

}

你可能感兴趣的:(手写常见排序算法(冒泡排序,选择排序,插入排序,快速排序))