一 概述
基本排序算法有如下:冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,堆排序,还有比较特殊的桶排序。
其中稳定性:两个相同的元素排序前后相对位置不变。
二 交换类排序
交换类 排序也就是冒泡排序和快速排序,冒泡:它是一种较简单的排序算法。遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!优化方式是如果一轮下来没有发生交换,则说明已经排序。
快速排序的思想中:选择一个基准元素,把小于它的全都移动到左边,大于的全部移动到右边。所以基准元素的位置确定了,然后递归进行左边数组和右边数组的定位操作。是一种分治的思想。
它的两个改进方法是:1.选择基准元素的时候,如果一直是最左边或是最右边元素,而恰好此时给定的元素相对有序,那么排序的递归将偏向一边,和搜索二叉树退化成链表的样子很像。所以增加随机性,随机选取基准元素。 2. 如果数组中存在大量的相同元素,一次扫描其实可以完成多个元素的定位 增加速度。
三 具体 实现代码
package sort;
import java.util.Arrays;
// 此类为交换类排序算法 包括冒泡排序 和快速排序
// 冒泡排序的一个小优化 如果内层循环没有交换 则当前数组已经有序 可以跳出循环
//快速排序有两个优化点,一是增加基准元素随机性 二是如果相同元素 比价多 一次可以定位多个元素
public class JiaoHuan {
public static void main(String[] args) {
int arr[] = {1, -1, 10,10,10, -63,98, 86, 222};
quickSort1(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void maoPao(int arr[]) {
if(arr==null||arr.length==0)
return;
boolean flag = false;
for (int i = 0; i < arr.length; i++) {
flag = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
swap(arr, j, j + 1);
}
}
if(!flag){
break;
}
}
}
public static void quickSort(int arr[],int l,int r){
if (arr == null || arr.length == 0) {
return;
}
int q = partition(arr, l, r);
if(q>l){
quickSort(arr, l, q - 1);
}
if(q<r){
quickSort(arr, q + 1, r);
}
}
// 基准元素 选择
public static int partition(int arr[],int l,int r) {
int k = l;
// 第一个优化的方向 增加基准元素的随机性 防止出现倾斜的情况
swap(arr, r, (int) Math.random() * (r - l + 1) + l);
while(l<r){
if(arr[l]<arr[r]) {
swap(arr, k++, l);
}
l++;
}
swap(arr, k, r);
return k;
}
public static void quickSort1(int arr[],int l,int r){
if (arr == null || arr.length == 0) {
return;
}
int brr[] = partition1(arr, l, r);
if(brr[0]>l){
quickSort(arr, l, brr[0] - 1);
}
if(brr[1]<r){
quickSort(arr, brr[1]+ 1, r);
}
}
public static int[] partition1(int arr[],int l,int r) {
swap(arr, r, (int) Math.random() * (r - l + 1) + l);
int k = l;
int m = r ;
while(l<m){
if(arr[l]<arr[r]){
swap(arr, k++, l);
}else if(arr[l]>arr[r]) {
swap(arr, --m, l);
}
else{
l++;
}
}
swap(arr, r, m);
return new int []{k,m+1};
}
// 工具方法 实现两个数组元素的交换
public static void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}