快速排序是由C.A.R.Hoare提出来的。快速排序又称为分割交换排序法,是目前公认最佳的排序法,也是使用“分而治之”的方式,会在数据中找到一个虚拟的中间值称为基准,并按此基准将所有打算排序的数据分为两部分。其中小于基准的数据放在左边,而大于基准的数据方在右边,再以同样的方式分别处理左、右两边的数据,直到排序完成为止。
算法分析:
(1)在最好情况和平均情况下,时间复杂度为O(n);在最坏情况下(每次挑选中间值不是最大就是最小)下,其时间发复杂度为O()。
(2)快速排序不是稳定排序算法。
(3)在最坏情况下,空间复杂度为O(n);在最坏情况下,空间复杂度为O()。
(4)快速排序是平均运行时间最快的排序法。
代码实现:
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr=new int[]{3,6,2,8,4,9};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr, int left, int right) {
//采用双路方法
int l = left;//左边移动的下标
int r = right;//右边移动的下标
int tmp = 0;//临时变量 ,用于下面的交换
int pivot = arr[(left + right) / 2];//基准
while (l < r) {
//找到左边比基准大的数
while (arr[l] < pivot) {
l++;
}//找到右边比基准大的数
while (arr[r] > pivot) {
r--;
}
if (l >= r) {
break;
}//左右交换
tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
if (arr[l] == pivot) {
r--;
}
if (arr[r] == pivot) {
l++;
}
}
if (l==r){
l++;
r--;
}
if (left<r){
sort(arr,left,r);
}
if(right>l){
sort(arr,l,right);
}
}
}
归并排序(MergeSort):是针对已排序好的两个或两个以上的数列,通过合并的方式将其组合成已排序好的数列。
算法分析:
(1)最好情况、最坏情况及平均情况的时间复杂度为O(n).
(2)由于在排序过程中需要一个与大数据文件大小同样的额外空间,因此空间复杂度为O(n)。
(3)归并排序法是稳定排序法
代码实现
import chongzai.test;
import org.testng.annotations.AfterTest;
public class MergeSort {
public static void merge(int[] a, int left, int mid, int right){
int []tmp=new int[a.length];//辅助数组
int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针
while(p1<=mid && p2<=right){
if(a[p1]<=a[p2])
tmp[k++]=a[p1++];
else
tmp[k++]=a[p2++];
}
while(p1<=mid) tmp[k++]=a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
while(p2<=right) tmp[k++]=a[p2++];//同上
//复制回原数组
for (int i = left; i <=right; i++)
a[i]=tmp[i];
}
public static void mergeSort(int[] a, int start, int end){
if(start<end){//当子序列中只有一个元素时结束递归
int mid=(start+end)/2;//划分子序列
mergeSort(a, start, mid);//对左侧子序列进行递归排序
mergeSort(a, mid+1, end);//对右侧子序列进行递归排序
merge(a, start, mid, end);//合并
}
}
public static void main(String[] args) {
int[] a = {49, 38, 65, 97, 76, 13, 27, 50};
mergeSort(a, 0, a.length - 1);
System.out.println("排好序的数组:");
for (int e : a)
System.out.print(e + " ");
}
}