算法导论排序算法汇总

来源:互联网 发布:社会网络分析法软件 编辑:程序博客网 时间:2024/05/12 18:14

插入排序

INSERTION-SORT(A)1 for j=2 to A.length2   key=A[j]3   // insert A[j] into the sorted sequence A[1...j-1].4   i=j-15   while i>0 and A[i]>key6     A[i+1]=A[i]7     i=i-18   A[i+1]=key

最坏运行时间为Θ(n2),平均运行时间为Θ(n2)
java代码如下:

    /**     * 插入排序     * @param A     */    public static void Insertion_Sort(double[] A){        for (int i = 1; i < A.length; i++){            double key = A[i];            int j = i - 1;            while (j >= 0 && A[j] > key){                A[j + 1] = A[j];                j--;            }            A[j + 1] = key;        }    }

归并排序

MERGE-SORT(A,p,r)1 if p<r2   q=(p+r)/2向下取整3   MERGE-SORT(A,p,q)4   MERGE-SORT(A,q+1,r)5   MERGE(A,p,q,r)

其中MERGE(A,p,q,r)为:

MERGE(A,p,q,r)1  n_1=q-p+12  n_2=r-q3  let L[1..n_1+1] and R[1..n_2+1] be new arrays4  for i = 1 to n_15    L[i] = A[p+i-1]6  for j = 1 to n_27    R[j] = A[q+j]8  L[n_1+1]=无穷大9  R[n_2+1]=无穷大10 i=111 j=112 for k=p to r13   if L[i] <= R[j]14     A[k]=L[i]15     i=i+116   else A[k]=R[j]17     j=j+1

最坏情况运行时间为Θ(nlgn),平均情况为Θ(nlgn)
java代码如下:

    /**     * 归并排序     * @param A     * @param p     * @param r     */    public static void Merge_Sort(double[] A, int p, int r){        if (p < r){            int q = (p + r)/2;            Merge_Sort(A, p,q);            Merge_Sort(A, q+1, r);            Merge(A, p, q, r);        }    }    public static void Merge(double[] A, int p, int q, int r){        int n1 = q - p + 1;        int n2 = r - q;        double[] L = new double[n1 + 1];        double[] R = new double[n2 + 1];        for (int i = 0; i < n1; i++){            L[i] = A[p + i];        }        for (int j = 0; j < n2; j++){            R[j] = A[q + j + 1];        }        L[n1] = R[n2] = 100000;        for (int k = p, i = 0, j = 0; k <= r; k++){            if (L[i] <= R[j]){                A[k] = L[i];                i++;            }else{                A[k] = R[j];                j++;            }        }    }

冒泡排序

BUBBLESORT(A)1 for i = 1 to A.length -12   for j = A.length downto i + 13     if A[j] < A[j-1]4       exchange A[j] with A[j-1]

最坏情况的运行时间为Θ(n2),平均运行时间为O(n2)
java代码如下:

    /**     * 冒泡排序     * @param A     */    public static void Bubble_Sort(double[] A){        for (int i = 0; i < A.length -1; i++){            for (int j = A.length - 1; j >= i + 1; j--){                if (A[j] < A[j - 1]){                    double x = A[j];                    A[j] = A[j - 1];                    A[j - 1] = x;                }            }        }    }

堆排序

首先需要用到的几个函数:

LEFT(i)1 return 2iRIGHT(i)1 return 2i + 1

然后MAX-HEAPIFY(A,i)函数:

MAX-HEAPIFY(A,i)1  l = LEFT(i)2  r = RIGHT(i)3  if l <= A.heap-size and A[l] > A[i]4    largest = l5  else largest = i6  if r <= A.heap-size and A[r] > A[largest]7    largest = r8  if largest 不等于 i9    exchange A[i] with A[largest]10   MAX-HEAPIFY(A,largest)

还有BUILD-MAX-HEAPIFY(A)函数:

BUILD-MAX-HEAP(A)1 A.heap-size = A.length2 for i = \lfloor A.length/2 \rfloor downto 13   MAX-HEAPIFY(A,i)

最后的堆排序算法:

HEAPSORT(A)1 BUILD-MAX-HEAP(A)2 for i = A.length downto 23   exchange A[1] with A[i]4   A.heap-size = A.heap-size - 15   MAX-HEAPIFY(A,1)

堆排序的最坏情况运行时间为O(nlgn)
java代码如下:

public static void Max_Heapify(double[] A, int heap_size, int i){        int l = 2*i + 1;        int r = 2*i + 2;        int largest;        if (l <= heap_size - 1 && A[l] > A[i]){            largest = l;        }else {            largest = i;        }        if (r <= heap_size - 1 && A[r] > A[largest]){            largest = r;        }        if (largest != i){            double x = A[i];            A[i] = A[largest];            A[largest] = x;            Max_Heapify(A, heap_size, largest);        }    }    public static void Build_Max_Heapify(double[] A, int heap_size){        heap_size = A.length;        for (int i = A.length/2; i >= 0; i--){            Max_Heapify(A, heap_size, i);        }    }    /**     * 堆排序     * @param A     */    public static void Heap_Sort(double[] A){        int heap_size = A.length;        Build_Max_Heapify(A, heap_size);        for (int i = A.length - 1; i >= 1; i--){            double x = A[0];            A[0] = A[i];            A[i] = x;            heap_size--;            Max_Heapify(A, heap_size, 0);        }    }

快速排序

QUICKSORT(A, p, r)1 if p < r2   q = PARTITION(A, p, r)3   QUICKSORT(A, p, q - 1)4   QUICKSORT(A, q + 1, r)

其中

PARTITION(A, p, r)1 x = A[r]2 i = p - 13 for j = p to r - 14   if A[j] <= x5     i = i + 16     exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

java实现代码如下:

    /**     * 快速排序     * @param A     * @param p p应该从0开始     * @param r r应该从A.length-1开始     */    public static void Quick_Sort(double[] A, int p, int r){        if (p < r){            int q = Partition(A, p, r);            Quick_Sort(A, p, q - 1);            Quick_Sort(A, q + 1, r);        }    }    private static int Partition(double[] A, int p, int r) {        // TODO Auto-generated method stub        double x = A[r];        int i = p - 1;        for (int j = p; j < r; j++){            if (A[j] <= x){                i++;                double m = A[i];                A[i] = A[j];                A[j] = m;            }        }        double m = A[i + 1];        A[i + 1] = A[r];        A[r] = m;        return i + 1;    }

计数排序

COUNTING-SORT(A, B, k)1  let C[0 ..k] be a new array2  for i = 0 to k3    C[i] = 04  for j = 1 to A.length5    C[A[j]] = C[A[j]] + 16  // C[i] now contains the number of elements equal to i.7  for i = 1 to k8    C[i] = C[i] + C[i - 1]9  // C[i] now contains the number of elements less than or equal to i.10 for j = A.length downto 111   B[C[A[j]]] = A[j]12   C[A[j]] = C[A[j]] - 1

java代码如下:

    /**     * 要求A中元素必须是非负整数     * @param A     * @param k A中最大的元素加1     */    public static int[] Counting_Sort(int[] A, int k){        int[] C = new int[k];        int[] B = new int[A.length];        for (int i = 0; i < A.length; i++){            C[A[i]] = C[A[i]] + 1;        }        for (int i = 1; i < C.length; i++){            C[i] = C[i] + C[i - 1];        }        for (int j = A.length - 1; j >= 0; j--){            B[C[A[j]] - 1] = A[j];            C[A[j]] = C[A[j]] - 1;        }        return B;    }

基数排序

RADIX-SORT(A, d)1 for i = 1 to d2   use a stable sort sort array A on digit i

java实现代码:

    /**     * 基数排序     * @param A     * @param d 数组A中最大数的位数     * @return     */    public static int[] Radix_Sort(int[] A, int d){        int[] B = new int[A.length];            // 用来存储每次排序好的数组        int[] temp = new int[A.length];         // 用来复制排序好的数组,并在下次循环中对其中的数据的第i位进行排序        System.arraycopy(A, 0, temp, 0, A.length);        for (int i = 1; i <= d; i++){            int[] C = new int[10];            for (int j = 0; j < temp.length; j++){                int Ai = (temp[j]/(int)Math.pow(10, i - 1))%10;     // 求每位数的第i位                C[Ai]++;            }            for (int k = 1; k < C.length; k++){                C[k] = C[k] + C[k - 1];             }            for (int h = temp.length - 1; h >= 0; h--){                int Ai = (temp[h]/(int)Math.pow(10, i - 1))%10;                B[C[Ai] - 1] = temp[h];                C[Ai] = C[Ai] - 1;            }            System.arraycopy(B, 0, temp, 0, B.length);        }        return B;    }

桶排序

BUCKET-SORT(A)1 n = A.length2 let B[0..n-1] be a new array3 for i = 0 to n - 14   nake B[i] an empty list5 for i = 1 to n6   insert A[i] into list B[\lfloor nA[i] \rfloor]7 for i = 0 to n - 18   sort list B[i] with insertion sort9 concatenate the lists B[0], B[1], ... , B[n-1] togather in ordera

java实现代码如下:

    /**     * 桶排序     * @param A     * @return     */    @SuppressWarnings({ "rawtypes", "unchecked" })    public static double[] Bucket_Sort(double[] A){        int n = A.length;        List[] B = new ArrayList[n];        for (int i = 0; i < n; i++){            B[i] = new ArrayList();        }        for (int i = 0; i < n; i++){            B[(int)(n*A[i])].add(A[i]);        }        for (int i = 0; i < n; i++){            Insertion_Sort(B[i]);        }        double[] C = new double[A.length];        int j = 0;        for (int i = 0; i < n; i++){            for (Object x : B[i]){                C[j++] = (double)x;            }        }        return C;    }    public static void Insertion_Sort(List A){        for (int i = 1; i < A.size(); i++){            double key = (double)A.get(i);            int j = i - 1;            while (j >= 0 && (double)A.get(j) > key){                A.set(j + 1, A.get(j));                j--;            }            A.set(j + 1, key);        }    }
0 0
原创粉丝点击