常用排序算法总结

/**
 * 排序算法总结
 *
 *
 * @author bobo
 * @date 2014-7-22 
 *
 */
public class Test
{
    public static void main(String[] args)
    {
        int[] arr = {50,38,87,42,757,45,100,4,78};
        //insertSort(arr);//插入排序
        //selectSort(arr);//选择排序
        //bubbleSort(arr);//冒泡排序
        //shellSort(arr);//希尔排序
        //quickSort(arr);//快速排序
        baseSort(arr);//基数排序
        
        showArr(arr);
        
    }
    
    /**
     * 基数排序
     *
     *
     * @param arr 数组
     */
    public static void baseSort(int[] arr)
    {
        int length = arr.length;
        int[][] tong = new int[10][length];
        
        //根据位来循环,个位开始
        for (int pos = 1; pos <= 10; pos++)
        {
            for (int j = 0; j < length; j++)
            {
                //当前元素
                int curData = arr[j];
                
                //找出对应位的值
                int rate = (int) Math.pow(10, pos - 1);
                int curPosNum = (curData / rate) % 10;
                
                //对第二维赋值
                for (int k = 0; k < length; k++)
                {
                    //对应k列的值
                    int curColumnNum = tong[curPosNum][k];
                    
                    //如果为0,说明没有放置数据
                    if (0 == curColumnNum)
                    {
                        tong[curPosNum][k] = curData;
                        break;
                    }
                }
            }
            
            //收集放置好的数据到排序数组
            for (int i = 0, j = 0; i < 10; i++)
            {
                for (int k = 0; k < tong[i].length; k++)
                {
                    if (tong[i][k] > 0)
                    {
                        arr[j++] = tong[i][k];
                    }
                }
            }
            tong = new int[10][length];//排完一次后重置
        }
        
    }

    /**
     * 快速排序
     *
     *
     * @param arr 数组
     */
    public static void quickSort(int[] arr)
    {
        //快速排序是一个递归方法,从0作为低起点,arr.length-1作为高起点
        qSort(arr, 0, arr.length -1);
        
    }

    private static void qSort(int[] arr, int low, int high)
    {
        if (low < high)
        {
            int centerIndex = partenArr(arr, low, high);
            qSort(arr, low, centerIndex - 1);//对前半部分排序
            qSort(arr, centerIndex + 1, high);//对后半部分排序
        }
        
    }

    private static int partenArr(int[] arr, int low, int high)
    {
        int temp;
        temp = arr[low];
        while (low < high)
        {
            //从后往前找,找出后半部分第一个小于中间值的位置,进行交换
            while (low < high && arr[high] >= temp)
            {
                high--;
            }
            swap(arr, low, high);
            
            //从前往后找,找出前半部分第一个大于中间值得位置,进行交换
            while (low < high && arr[low] <= temp)
            {
                low++;
            }
            swap(arr, low, high);
        }
        return low;
    }

    /**
     * 希尔排序
     * 划分步长,分别进行插入排序
     *
     *
     * @param arr 数组
     */
    public static void shellSort(int[] arr)
    {
        int i, j, gap, temp, k;
        for (gap = arr.length / 2; gap > 0; gap /= 2)
        {
            for (i = 0; i < gap; i++)
            {
                for (j = i + gap; j < arr.length; j += gap)
                {
                    if (arr[j] < arr[j - gap])
                    {
                        temp = arr[j];
                        for (k = j - gap; k >= 0 && arr[k] > temp; k -= gap)
                        {
                            arr[k + gap] = arr[k];
                        }
                        arr[k + gap] = temp;
                    }
                }
                
            }
            
        }
    }

    /**
     * 冒泡排序
     * 循环length-1次,从后往前比较,如果后一个小于前一个,进行交换
     *
     * @param arr 数组
     */
    public static void bubbleSort(int[] arr)
    {
        int i, j;
        boolean flag = true;//如果没有交换,退出循环
        for (i = 1; i < arr.length && flag; i++)
        {
            flag = false;
            for (j = arr.length - 1; j >= i; j--)
            {
                if (arr[j - 1] > arr[j])
                {
                    flag = true;
                    swap(arr, j - 1, j);
                }
            }
        }
    }

    /**
     * 选择排序
     * 循环length-1次,拿某个位置的数与后面的所有比较
     *
     *
     * @param arr 数组
     */
    public static void selectSort(int[] arr)
    {
        int i, j;
        //外循环从第一个开始到倒数第二个结束
        for (i = 0; i < arr.length - 1; i++)
        {
            //内循环从第二个开始到最后一个结束
            for (j = i + 1; j < arr.length; j++)
            {
                if (arr[i] > arr[j])
                {
                    swap(arr, i, j);
                }
            }
        }
    }

    /**
     * 插入排序
     * 循环length-1次,如果【i-1】>【i】的数,需要交换位置,比较是从后往前比较
     *
     * @param arr 数组
     */
    public static void insertSort(int[] arr)
    {
        int i, j, temp;
        //从第二个开始,到最后一个结束
        for (i = 1; i < arr.length; i++)
        {
            //如果前一个大于后一个
            if (arr[i] < arr[i - 1])
            {
                temp = arr[i];//中间变量
                for (j = i - 1; j >= 0 && arr[j] > temp; j--)
                {
                    arr[j + 1] = arr[j];
                }
                //此时j--了,到了正确插入的位置
                arr[j + 1] = temp;
            }
            
        }
        
    }
    
    /**
     * 交换两个值的位置
     *
     *
     * @param arr 数组
     * @param i 下标
     * @param j 下标
     */
    private static void swap(int[] arr, int i, int j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    /**
     * 显示数组
     *
     *
     * @param arr 数组
     */
    private static void showArr(int[] arr)
    {
        for (int i = 0; i < arr.length; i++)
        {
            if (i == arr.length - 1)
            {
                System.out.print(arr[i]);
            }
            else
            {
                System.out.print(arr[i] + ",");
            }
            
        }
    }
}

 

点赞