起泡排序的思想非常简单。首先,将 n 个元素中的第一个和第二个进行比较,如果两个元素的位置为逆序,则交换两个元素的位置;进而比较第二个和第三个元素关键字,如此类推,直到比较第 n-1 个元素和第 n 个元素为止;上述过程描述了起泡排序的第一趟排序过程,在第一趟排序过程中,我们将关键字最大的元素通过交换操作放到了具有 n 个元素的序列的最一个位置上。然后进行第二趟排序,在第二趟排序过程中对元素序列的前 n-1 个元素进行相同操作,其结果是将关键字次大的元素通过交换放到第 n-1 个位置上。一般来说,第 i 趟排序是对元素序列的前 n-i+1 个元素进行排序,使得前 n-i+1 个元素中关键字最大的元素被放置到第 n-i+1 个位置上。排序共进行 n-1 趟,即可使得元素序列按关键字有序。
public void Bubble_Sort(int A[], int N) { for (int P = N - 1; P >= 0; P--) { int flag = 0; for (int i = 0; i < P; i++) { if (A[i] > A[i + 1]) { int temp = A[i]; A[i] = A[i + 1]; A[i + 1] = temp; flag = 1; } } if (flag == 0) break; } for (int i = 0; i < N; i++) { System.out.print(A[i] + " "); } }【效率分析】
public static void Quick_Sort(int[] A, int begin, int end) { if (begin < end) { // 枢轴选定后永远不变,最终在中间,前小后大 int key = A[begin]; int i = begin; int j = end; // 大的元素放在右边,小的元素放在左边,来实现子集划分。 while (i < j) { // 两端交替向内部扫描。 while (i < j && A[j] > key) { // 当右侧元素大于枢轴元素,符合条件则指针左移。 j--; } if (i < j) { // 当满足上面条件时,将两个元素倒换位置,并使指针从开始位置右移。 A[i] = A[j]; i++; } while (i < j && A[i] < key) { // 当右侧元素大于枢轴元素,符合条件则指针右移。 i++; } if (i < j) { A[j] = A[i]; j--; } } A[i] = key; System.out.println(i); Quick_Sort(A, begin, i - 1); Quick_Sort(A, i + 1, end); } } public static void quickSort(int[] n, int left, int right) { int pivot; if (left < right) { // pivot作为枢轴,较之小的元素在左,较之大的元素在右 pivot = partition(n, left, right); // 对左右数组递归调用快速排序,直到顺序完全正确 quickSort(n, left, pivot - 1); quickSort(n, pivot + 1, right); } } public static int partition(int[] n, int left, int right) { int pivotkey = n[left]; // 枢轴选定后永远不变,最终在中间,前小后大 while (left < right) { while (left < right && n[right] >= pivotkey) --right; // 将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上 n[left] = n[right]; while (left < right && n[left] <= pivotkey) ++left; // 将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上 n[right] = n[left]; } // 当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上 n[left] = pivotkey; return left; }
详谈排序算法之交换类排序(两种方法实现快速排序【思路一致】)
原文地址:http://blog.csdn.net/qq_21394609/article/details/43912433