版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32250495/article/details/77069544
package Com.Sort;
/**
* 各种高级排序方法的实现
*
* @author Jane
*/
public class AdvanceSort {
// 打印数组
public static <T extends Comparable<? super T>> void print(T[] a) {
for (T t : a) {
System.out.print(t + " ");
}
System.out.println();
}
**// 希尔排序 亚次方的时间界O(N^3/2)**
public static <T extends Comparable<? super T>> void shellSort(T[] a) {
int j;
for (int gap = a.length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < a.length; i++) {
T tmp = a[i]; // 鎸夌収姣忎竴涓閲忔彃鍏ユ帓搴�
for (j = i; j >= gap && tmp.compareTo(a[j - gap]) < 0; j -= gap)
a[j] = a[j - gap];
a[j] = tmp;
}
}
}
**// 归并排序,O(n)的辅助存储,O(nlogn)的时间界**
private static <T extends Comparable<? super T>> void mergeSort(T[] a, T[] temp, int left, int right) {
if (left < right) {
int center = (left + right) / 2;
mergeSort(a, temp, left, center);
mergeSort(a, temp, center + 1, right);
merge(a, temp, left, center + 1, right);
}
}
private static <T extends Comparable<? super T>> void merge(T[] a, T[] temp, int leftpos, int rightpos,
int rightEnd) {
int leftEnd = rightpos - 1;
int tmpPos = leftpos;
int numElements = rightEnd - leftpos + 1;
while (leftpos <= leftEnd && rightpos <= rightEnd) {
if (a[leftpos].compareTo(a[rightpos]) <= 0)
temp[tmpPos++] = a[leftpos++];
else
temp[tmpPos++] = a[rightpos++];
}
while (leftpos <= leftEnd)
temp[tmpPos++] = a[leftpos++];
while (rightpos <= rightEnd)
temp[tmpPos++] = a[rightpos++];
for (int i = 0; i < numElements; i++, rightEnd--)
a[rightEnd] = temp[rightEnd];
}
**// 归并排序 外部调用接口**
public static <T extends Comparable<? super T>> void mergeSort(T[] a) {
T[] tmp = (T[]) new Comparable[a.length];
mergeSort(a, tmp, 0, a.length - 1);
}
**// 堆排序 O(nlogn)可以不用辅存**
public static <T extends Comparable<? super T>> void heapSort(T[] a) {
for (int i = a.length / 2; i >= 0; i--)
percDown(a, i, a.length);
for (int i = a.length - 1; i > 0; i--) {
swapReference(a, 0, i);
percDown(a, 0, i);
}
}
// 下虑操作
private static <T extends Comparable<? super T>> void percDown(T[] a, int i, int n) {
int child;
T tmp;
for (tmp = a[i]; 2 * i + 1 < n; i = child) {
child = 2 * i + 1;
if (child != n - 1 && a[child].compareTo(a[child + 1]) < 0)
child++;
if (tmp.compareTo(a[child]) < 0)
a[i] = a[child];
else
break;
}
a[i] = tmp;
}
private static <T extends Comparable<? super T>> void swapReference(T[] a, int i, int n) {
T tmp = a[n];
a[n] = a[0];
a[0] = tmp;
}
**// 快速排序,常见那种选择第一个作为pivot**
public static <T extends Comparable<? super T>> void quickSort(T[] a, int i, int j) {
if ((j - i) <= 0)
return;
int left = i;
int right = j;
T tmp = a[left];
while (i < j) {
while (i < j && tmp.compareTo(a[j]) <= 0)
j--;
a[i] = a[j];
while (i < j && tmp.compareTo(a[i]) >= 0)
i++;
a[j] = a[i];
}
a[i] = tmp;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
**// 快速排序,选择三个试验点的中值作为pivot**
public static <T extends Comparable<? super T>> void quickSort2(T[] a, int left, int right) {
if (right - left >= 4) {
T pivot = median3(a, left, right);
int i = left;
int j = right - 1;
for (;;) {
while (a[++i].compareTo(pivot) < 0) {
}
while (a[--j].compareTo(pivot) > 0) {
}
if (i < j)
swap(a, i, j);
else
break;
}
swap(a, i, right - 1);
quickSort2(a, left, i - 1);
quickSort2(a, i + 1, right);
} else
AdvanceSort.quickSort(a, left, right);
}
private static <T extends Comparable<? super T>> T median3(T[] a, int i, int j) {
int center = (i + j) / 2;
if (a[center].compareTo(a[i]) < 0)
swap(a, center, i);
if (a[j].compareTo(a[i]) < 0)
swap(a, j, i);
if (a[j].compareTo(a[center]) < 0)
swap(a, j, center);
swap(a, center, j - 1);
return a[j - 1];
}
private static <T extends Comparable<? super T>> void swap(T[] a, int i, int j) {
T tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
简单排序的实现
package Com.Sort;
/**
*
* @author Jane
*/
public class SimpleSort {
//打印数组
public static <T extends Comparable<? super T>> void print(T [] a)
{
for (T t : a) {
System.out.print(t+" ");
}
System.out.println();
}
**//插入排序 O(n^2)**
public static <T extends Comparable<? super T>> void insertSort(T [] a)
{
int j;
for(int p=1;p<a.length;p++)
{
T tmp=a[p];
for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--)
a[j]=a[j-1];
a[j]=tmp;
}
}
**//选择排序**
public static <T extends Comparable<? super T>> void selectSort(T [] a)
{
for(int i=0;i<a.length-1;i++)
{
for(int j=i+1;j<a.length;j++)
{
if(a[j].compareTo(a[i])<0)
{
T tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}
}
}
**//冒泡排序**
public static <T extends Comparable<? super T>> void maoPaoSort(T [] a)
{
boolean flag=true;
for(int i=a.length;i>0;i--)
{
for(int j=0;j<i-1;j++)
{
if(a[j+1].compareTo(a[j])<0)
{
T tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
flag=false;
}
}
if(flag)
break;
}
}
}