算法导论排序算法汇总
来源:互联网 发布:社会网络分析法软件 编辑:程序博客网 时间: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
最坏运行时间为
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)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
最坏情况运行时间为
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]
最坏情况的运行时间为
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)
堆排序的最坏情况运行时间为
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
- 算法导论排序算法汇总
- 《算法导论》排序算法
- 《算法导论》排序算法
- 算法导论答案汇总
- 《算法导论》笔记汇总
- 《算法导论》笔记汇总
- 算法导论@汇总提纲
- 算法导论:插入排序
- 算法导论 堆排序
- 算法导论 计数排序
- 【算法导论】拓扑排序
- 【算法导论】拓扑排序
- 【算法导论】计数排序
- 算法导论--堆排序
- 算法导论:排序
- 算法导论-快速排序
- 【算法导论】 堆排序
- 插入排序【算法导论】
- G - Closest Common Ancestors
- Leet Code OJ 283. Move Zeroes [Difficulty: Easy]
- http响应Last-Modified和ETag以及Apache和Nginx中的配置
- html+css制作带三角的矩形
- 46. Permutations
- 算法导论排序算法汇总
- 手动导入xmpp后,再使用cocoapods的时候出现的问题
- The Swift Programming Language学习笔记(二十五)——访问控制
- 设置或修改Redis访问密码
- Mybatis代码自动生成
- Apache的配置文件http.conf参数含义详解
- jQuery学习笔记四(jQuery - AJAX)
- 机器学习系列(7)_机器学习路线图(附资料)
- insmod和rmmod