Java编程实现数组排序——(二)交换排序

来源:互联网 发布:女超人于莺离婚知乎 编辑:程序博客网 时间:2024/05/18 03:18

借助“交换”进行排序的方法。

一、冒泡排序

冒泡排序是比较相邻两个元素,若为逆序,则交换两个元素,然后比较第二个记录与第三个记录的值,依次类推。一趟冒泡排序的结果是使其中最大(小)的记录冒到最后的位置。

若为正序,冒泡排序只需要做n-1次关键字的比较,时间复杂度在这种情况下达到最好,为O(n)。

冒泡排序在最坏和平均情况下时间复杂度为O(n^2)。

用Java写的冒泡排序的一段代码如下:

public class Demo01 {public static void bubbleSort(int[] arr){for(int i=0;i<arr.length;i++){for(int j=0;j<arr.length-i-1;j++){if(arr[j+1]<arr[j]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}public static void main(String[] args) {int[] arr=new int[9];arr[0]=22;arr[1]=49;arr[2]=38;arr[3]=65;arr[4]=97;arr[5]=76;arr[6]=13;arr[7]=27;arr[8]=49;bubbleSort(arr);for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}}}

二、快速排序

快速排序是通过一趟排序将待记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录关键字小。

整个快速排序的过程可以递归进行,一般选取序列中的某一个值作为“支点”,可以附设两个指针low和high,从high位置起向前搜索,找到第一个关键字小于“支点”的记录和“支点”记录交换,然后从low位置向后搜索,找到第一个关键字大于“支点”的记录和“支点”交换,直到low=high为止,完成了一次快速排序。

在所有数量级相同的先进的排序算法中,快速排序的常数因子最小,就平均时间而言,快速排序是目前被认为最好的一种内部排序算法。

若记录序列初始序列基本有序时,快速排序退化为冒泡排序。快速排序需要一个栈空间来实现递归。

时间复杂度:

    最好、平均:O(nlogn)

    最差:O(n^2)

空间复杂度:

    最好:O(logn)

    最差:O(n)

快速排序的Java实现如下:

public class Demo01 {/** * 一次快速排序过程 * @param arr待排序数组 * @param low低位置指针 * @param high高位置指针 * @returnlow */private static int Partition(int[] arr,int low,int high){arr[0]=arr[low];int pivotkey=arr[low];while(low<high){while(low<high&&arr[high]>=pivotkey)high--;//将比支点记录小的记录交换到低端arr[low]=arr[high];while(low<high&&arr[low]<=pivotkey)low++;//将比支点记录大的记录交换到高端arr[high]=arr[low];}arr[low]=arr[0];return low;}/** * 递归调用快速排序 * @param arr * @param low * @param high */private static void QSort(int[] arr,int low,int high){if(low<high){int pivotloc=Partition(arr, low, high);Partition(arr, low, pivotloc-1);Partition(arr, pivotloc+1, high);}}public static void QuickSort(int[] arr){QSort(arr, 1, arr.length-1);}public static void main(String[] args) {int[] arr=new int[9];arr[0]=22;arr[1]=49;arr[2]=38;arr[3]=65;arr[4]=97;arr[5]=76;arr[6]=13;arr[7]=27;arr[8]=49;QuickSort(arr);for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}}}


0 0