常见排序算法总结

来源:互联网 发布:mac用minila 编辑:程序博客网 时间:2024/05/21 17:26

1. 冒泡排序
普通版:

public static void bubbleSort(int[] nums){    int len = nums.length;    for(int i = 0; i < len - 1; i++){        for(int j = 0; j < len - 1 - i; j++){            if(nums[j + 1] < nums[j]){                int tmp = nums[j + 1];                nums[j + 1] = nums[j];                nums[j] = tmp;            }        }    }}

改良版:

public static void bubbleSortUpdated(int[] nums){    int len = nums.length;    boolean flag = true;    while(flag){        flag = false;        for(int j = 0; j < len - 1; j++){            if(nums[j + 1] < nums[j]){                int tmp = nums[j + 1];                nums[j + 1] = nums[j];                nums[j] = tmp;                 flag = true;            }        }    }}

2. 堆排序

public static void heapSort(int[] nums){    int len = nums.length;    //循环建堆    for(int i = 0; i < len - 1; i++){        buildMaxHeap(nums, len - 1 - i);        swap(nums, 0, len - 1 - i);    }}    //建堆private static void buildMaxHeap(int[] nums, int lastIndex){    //从lastIndex处节点(最后一个节点)的父节点开始    for(int i = (lastIndex - 1) / 2; i >= 0; i--){        int k = i;    //k保存正在判断的节点          //如果当前k节点的子节点存在        while(k * 2 + 1 <= lastIndex){            int biggerIndex = 2 * k + 1; //k节点的左子节点的索引              //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在            if(biggerIndex < lastIndex){                //如果右子节点的值较大                if(nums[biggerIndex] < nums[biggerIndex + 1]){                    biggerIndex++;  //biggerIndex总是记录较大子节点的索引                }            }            //如果k节点的值小于其较大的子节点的值            if(nums[k] < nums[biggerIndex]){                swap(nums, k, biggerIndex);  //交换他们                //将biggerIndex赋予k,开始while的下一次循环,重新保证k节点的值大于其左右子节点的值                k = biggerIndex;              }else{                break;            }        }    }}//交换private static void swap(int[] nums, int i, int j){    int tmp = nums[i];    nums[i] = nums[j];    nums[j] = tmp;}

3. 插入排序

public static void insertSort(int[] nums){    int len = nums.length;    int tmp, j;    for(int i = 0; i < len; i++){        tmp = nums[i]; //每次都把新值赋给tmp        for(j = i; j > 0 && tmp < nums[j - 1]; j--){            nums[j] = nums[j - 1];        }        nums[j] = tmp;    }}

4. 归并排序

public static int[] mergeSort(int[] nums, int low, int high){    int mid = (high + low) / 2;    if(low < high){        mergeSort(nums, low, mid);        mergeSort(nums, mid + 1, high);        merge(nums, low, mid, high);    }    return nums;}private static void merge(int[] nums, int low, int mid, int high){    int[] tmp = new int[high - low + 1];    int i = low;    int j = mid + 1;    int k = 0;    //较小的数先移到新数组中    while(i <= mid && j <= high){        if(nums[i] < nums[j]){            tmp[k++] = nums[i++];        }else{            tmp[k++] = nums[j++];        }    }    //左边剩余的数移入新数组    while(i <= mid){        tmp[k++] = nums[i++];    }    //右边剩余的数移入新数组    while(j <= high){        tmp[k++] = nums[j++];    }    //新数组覆盖nums数组    for(int m = 0; m < tmp.length; m++){        nums[m + low] = tmp[m];    }}

5. 快速排序
第一种:

public static void quickSort(int[] nums, int low, int high){    if(low < high){        int key = nums[low];        int i = low, j;        for(j = low + 1; j <= high; j++){            if(nums[j] < key){                int tmp = nums[j];                nums[j] = nums[i + 1];                nums[i + 1] = tmp;                i++;            }        }        nums[low] = nums[i];        nums[i] = key;        quickSort(nums, low, i - 1);        quickSort(nums, i + 1, high);    }}

第二种:

public static int getMiddle(int[] nums, int low, int high){    int tmp = nums[low];    while(low < high){        while(low < high && nums[high] >= tmp){            high--;        }        nums[low] = nums[high];        while(low < high && nums[low] <= tmp){            low++;        }        nums[high] = nums[low];    }    nums[low] = tmp;    return low;}public static void quickSort2(int[] nums, int low, int high){    if(low < high){        int middle = getMiddle(nums, low, high);        quickSort2(nums, low, middle - 1);        quickSort2(nums, middle + 1, high);    }}

6. 选择排序

public static void selectSort(int[] nums){    int len = nums.length;    for(int i = 0; i < len; i++){        int k = i;        for(int j = i + 1; j < len; j++){            if(nums[j] < nums[k]){                k = j;            }        }        int tmp = nums[i];        nums[i] = nums[k];        nums[k] = tmp;    }}

7. 希尔排序

public static void shellSort(int[] nums){    int j = 0;    int tmp = 0;    for(int increment = nums.length / 2; increment > 0; increment /= 2){        for(int i = increment; i < nums.length; i++){            tmp = nums[i];            for(j = i; j >= increment; j -= increment){                 if(tmp < nums[j - increment]){                    nums[j] = nums[j - increment];                }                else{                    break;                }                nums[j] = tmp;            }        }    }}

各种排序算法的时间复杂度和稳定性:

这里写图片描述

原创粉丝点击