packagecom.cjs.alogrithm;/*** 此类采用泛型方法来提供对各种类型数据的各种排序算法
*
*@authorS
*@version1.0*/
public classMySort {/*** 冒泡排序来实现一系列数据的升序排列,改变了传入的数组
*
*@parama
* 传入的存储数据的数组,对其进行排序的目标数组
*@returnvoid*/
public static > voidbubbleSort(T a[]) {int n =a.length;for (int i = 1; i <= n - 1; i++) {for (int j = 0; j < n - i; j++) {if ((a[j]).compareTo(a[j + 1]) > 0) {
T t=a[j];
a[j]= a[j + 1];
a[j+ 1] =t;
}
}
}
}/*** 选择排序来实现一系列数据的升序排列,改变了传入的数组
*
*@parama
* 传入的存储数据数组,对其进行排序的目标数组
*@returnvoid*/
public static > voidselectSort(T[] a) {int n =a.length;for (int i = 0; i < n; i++) {
T x=a[i];int k =i;for (int j = i + 1; j < n; j++) {if (a[j].compareTo(x) < 0) {
x=a[j];
k=j;
}
}
a[k]=a[i];
a[i]=x;
}
}/*** 插入排序来实现一系列数据的升序排列,改变了传入的数组
*
*@parama
* 传入的存储数据的数组,对其进行排序的目标数组
*@returnvoid*/
public static > voidinsertSort(T[] a) {int n =a.length;for (int i = 1; i < n; i++) {
T x=a[i];int k =i;for (int j = i - 1; j >= 0; j--) {if (a[j].compareTo(x) > 0) {
a[j+ 1] =a[j];
k=j;
}
}
a[k]=x;
}
}/*** 归并排序来实现一系列数据的升序排列,改变了传入的数组,需要额外提供一个临时数组来辅助排序
*
*@parama
* 传入的存储数据的数组,对其进行排序的目标数组
*@paramleft
* 传入数组的左边界下标
*@paramright
* 传入数组的右边界下标
*@returnvoid*/
public static > voidmergeSort(T a[], T temp[],int left, intright) {//至少有两个元素,也是递归的结束条件
if (left
mergeSort(a, temp, left, mid);
mergeSort(a, temp, mid+ 1, right);//合并到临时数组temp
Merge(a, temp, left, mid, right);//复制回数组a
Copy(a, temp, left, right);
}
}/*** 归并排序中的合并操作,将二分后的数组按升序排列
*
*@parama
* 传入的数组
*@paramt
* 要合并到的临时数组
*@paramleft
* 传入数组的左边界下标
*@parammid
* 传入数组的中间下标
*@paramright
* 传入数组的右边界下标
*@returnvoid*/
private static > void Merge(T a[], T t[], intleft,int mid, intright) {//合并c[1:m]和c[m+1:r]到d[l,r]
int i = left, j = mid + 1, k =left;//两表中元素比较,类似于打擂台,大的复制到临时数组中
while (i <= mid && j <=right) {if (a[i].compareTo(a[j]) < 0) {
t[k++] = a[i++];
}else{
t[k++] = a[j++];
}
}//若前一个子序列剩余,则直接复制入临时数组
if (i >mid) {for (int q = j; q <= right; q++)
t[k++] =a[q];
}//后一个子序列
else{for (int q = i; q <= mid; q++)
t[k++] =a[q];
}
}/*** 归并排序中的复制操作,将数据从临时数组中复制到传入的原数组
*
*@parama
* 传入的数组
*@paramt
* 保存数据的临时数组
*@paramleft
* 传入数组的左边界下标
*@paramright
* 传入数组的右边界下标
*@returnvoid*/
private static > void Copy(T a[], T t[], intleft,intright) {for (int i = left; i <= right; i++)
a[i]=t[i];
}/*** 快速排序来实现一系列数据的升序排列,改变了传入的数组
*
*@parama
* 传入的存储数据的数组,对其进行排序的目标数组
*@paramleft
* 传入数组的左边界下标
*@paramright
* 传入数组的右边界下标
*@returnvoid*/
public static > void quickSort(T a[], intleft,intright) {if (left
quickSort(a, left, x- 1);
quickSort(a, x+ 1, right);
}
}/*** 快速排序中用来对元素进行划分,基准元素为a[left]
*
*@parama
* 传入的存储数据的数组,对其进行排序的目标数组
*@paramleft
* 传入数组的左边界下标
*@paramright
* 传入数组的右边界下标
*@returni 划分后基准元素所处位置的下标*/
private static > int Partition(T[] a, intleft,intright) {
T x=a[left];int i = left, j =right;while (i = 0)
j--;if (i
a[i]=a[j];
i++;
}while (i < j && a[i].compareTo(x) < 0)
i++;if (i
a[j]=a[i];
j--;
}
}
a[i]=x;returni;
}
}