详谈排序算法之交换类排序(两种方法实现快速排序【思路一致】)

1.冒泡排序

起泡排序的思想非常简单。首先,将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] + " ");}}【效率分析】空间效率: 仅使用一个辅存单元。时间效率: 假设待排序的元素个数为n,则总共要进行n-1趟排序,对j个元素的子序列进行一趟起泡排序需要进行j-1次关键字比较。由此,起泡排序的总比较次数为

因此,起泡排序的时间复杂度为Ο(n~2)。

2.快速排序

它的魅力之处在于它能在每次partition(排序算法的核心所在)都能为一个数组元素确定其排序最终正确位置(一次就定位准,下次循环就不考虑这个元素了)。

快速排序是将分治法运用到排序问题中的一个典型例子,快速排序的基本思想是:通过一个枢轴(pivot)元素将 n 个元素的序列分为左、右两个子序列 Ll 和 Lr,其中,在将左、右子序列排好序后,则整个序列有序,而对左右子序列的排序过程直到子序列中只包含一个元素时结束,此时左、右子序列由于只包含一个元素则自然有序。

用分治法的三个步骤来描述快速排序的过程如下: 划分步骤:通过枢轴元素x将序列一分为二, 且左子序列的元素均小于x,右子序列的元素均大于x; 治理步骤:递归的对左、右子序列排序; 组合步骤:无从快速排序算法的描述中我们看到,。

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;}

只要你扬帆,便会有八面来风。启程了,人的生命才真正开始。

详谈排序算法之交换类排序(两种方法实现快速排序【思路一致】)

相关文章:

你感兴趣的文章:

标签云: