package dataStruct;
public class SortMedth {
public static void main(String[] args) {
int a[] = { 21, 25, 49, 25, 16, 8, -101, 3 };
// bubbleSort(a); 冒泡排序
// bubbleSort1(a); 优化后的冒泡排序
// selectSort(a); 选择排序
// insertSort(a); 插入排序
// insertSort1(a); 二分插入排序
// shellSort(a); 希尔排序
//quickSort(a, 0, a.length - 1); 快速排序
//归并排序
mergeSort(a,0,a.length-1);
print(a);
}
/* 冒泡排序 */
// private static void bubbleSort(int[] a) {
// for (int i = 0; i < a.length - 1; i++) {
// for (int j = 0; j < a.length - i - 1; j++) {
// if (a[j] > a[j + 1]) {
// swap(a, j, j + 1);
// }
// }
//
// }
//
// }
/* 优化后的冒泡排序 */
// private static void bubbleSort1(int[] a) {
// for(int i=0;i<a.length-1;i++){
// boolean flag=true;
// for(int j=0;j<a.length-i-1;j++){
// if(a[j]>a[j+1]){
// swap(a,j,j+1);
// flag=false;
// }
// }
// if(flag==true){
// break;
// }
// }
// }
/* 选择排序 */
// private static void selectSort(int[] a) {
// for(int i=0;i<a.length-1;i++){
// int k=i;
// for(int j=i+1;j>a.length;j++){
// if(a[j]<a[k]){
// k=j;
// }
// }
// if(k!=i){
// swap(a,i,k);
// }
// }
// }
// private static void insertSort(int[] a) {
// for (int i = 0; i < a.length - 1; i++) {
// int temp = a[i + 1];
// int j = i;
// while (a[j] > temp) {
// a[j + 1] = a[j];
// j--;
// if (j < 0) {
// break;
// }
// }
// a[j = 1] = temp;
// }
//
// }
// // 利用二分法查找的插入排序
// private static void insertSort1(int[] a) {
// for(int i=0;i<a.length-1;i++){
// int temp=a[i+1];
// int low=0;
// int high=i;
// int mid;
// //在low与high之间进行二分查找;找到新的插入元素
// while(low<=high){
// mid=(low+high)/2;
// if(a[mid]>temp){
// high=mid-1;
// }else{
// low=mid+1;
// }
// }
// //经过上面的二查找,得到最新的元素位置是:high+1
// //把[high+1,i]区间内的所有元素往后移动一个位置
// for(int j=i;j>high;j--){
// a[j+1]=a[j];
// }
// a[high+1]=temp;
//
// }
//
// }
// 希尔排序
// private static void shellSort(int[] a) {
// // 进行分组,初始的gap=n/2;然后依次减半,直到最后依次取1
// for (int gap = (a.length + 1) / 2; gap > 0;) {
//
// // 分组冒泡 用冒泡进行优化,否则gap=1本身就是优化
// for (int i = 0; i < a.length - gap; i++) {
// // 组内排序
// for (int j = i; j < a.length - gap; j += gap) {
// if (a[j] > a[j + gap]) {
// swap(a,j,j+gap);
// }
// }
// }
// //for循环的修改有点复杂,直接写在for()里面不方便,因此单独那在这里
// if(gap>1){
// gap=(gap+1)/2;
// }else if(gap==1){
// break;
// }
// }
//
// }
// 快速排序
private static void quickSort(int[] a, int p, int r) {
// TODO Auto-generated method stub
// 把数组划分成:两个数组和一个元素
// a[p:r]==>a[p:q-1],a[q],a[q+1:r]
if (p < r) {
int q = partition(a, p, r);
quickSort(a, p, q - 1);
quickSort(a, q + 1, r);
}
}
private static int partition(int[] a, int p, int r) {
// 快排的优化,随机选取数列中的一个元素当作枢轴,交换到第一个元素的位置
int rand = (int) (Math.random() * (r - p));
swap(a, p, p + rand);
int x = a[p];// 第一元素为枢轴
int i = p;// 在左侧搜索的游标:找大
int j = r + 1;// 在右侧搜索的游戏:找小
while (true) {
while (a[++i] < x && i < r)
;// 在左侧定位到比枢轴大的数
while (a[--j] > x)
;// 在右侧定位倒比枢轴小的数
if (i >= j) {
break;
}
swap(a, i, j);
}
// 把枢轴换到小值区的最后一个元素
swap(a, p, j);
return j;
}
//归并排序
private static void mergeSort(int[] a, int left, int right) {
// TODO Auto-generated method stub
if(left<right){
//1先分解
//把整个数组分解成:[left,mid]和[mid+1,right]
int mid=(left+right)/2;
mergeSort(a,left,mid);//0~4==>mergeSort(a,0,2)和mergeSort(a,3,4)
mergeSort(a,mid+1,right);
//归并排序
int[] b=new int[a.length];
merge(a,b,left,mid,right);
//把辅助序列b中的数据复制到数组a中
copyArray(a,b,left,right);
}
}
private static void merge(int[] a, int[] b, int left, int mid, int right) {
// TODO Auto-generated method stub
int p=left;//游标遍历a[left,mid]
int r=mid+1;//游标,遍历a[mid+1,right]
int k=left;//游标,分解合并后结果数组。指定当前判断之后所选中的元素因该放那个位置
while(p<=mid&&r<=right){
if(a[p]<a[r]){
b[k]=a[p++];
}else{
b[k]=a[r++];
}
k++;
}
//把其中一个子序列当中剩余的元素直接照搬到归并结果数组当中
if(p>mid){//左序列已完成,剩下的是右序列需要照搬
for(int i=r;i<right;i++){
b[k++]=a[i];
}
}else{//右序列已完成,剩下的是左序列需要照搬
for(int i=p;i<=mid;i++){
b[k++]=a[i];
}
}
}
private static void copyArray(int[] a, int[] b, int left, int right) {
// TODO Auto-generated method stub
for(int i=left; i<=right;i++){
a[i] = b[i];
}
}
private static void swap(int[] a, int j, int i) {
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void print(int[] a) {
for (int num : a) {
System.out.print(num + "\t");
}
System.out.println();
}
}
public class SortMedth {
public static void main(String[] args) {
int a[] = { 21, 25, 49, 25, 16, 8, -101, 3 };
// bubbleSort(a); 冒泡排序
// bubbleSort1(a); 优化后的冒泡排序
// selectSort(a); 选择排序
// insertSort(a); 插入排序
// insertSort1(a); 二分插入排序
// shellSort(a); 希尔排序
//quickSort(a, 0, a.length - 1); 快速排序
//归并排序
mergeSort(a,0,a.length-1);
print(a);
}
/* 冒泡排序 */
// private static void bubbleSort(int[] a) {
// for (int i = 0; i < a.length - 1; i++) {
// for (int j = 0; j < a.length - i - 1; j++) {
// if (a[j] > a[j + 1]) {
// swap(a, j, j + 1);
// }
// }
//
// }
//
// }
/* 优化后的冒泡排序 */
// private static void bubbleSort1(int[] a) {
// for(int i=0;i<a.length-1;i++){
// boolean flag=true;
// for(int j=0;j<a.length-i-1;j++){
// if(a[j]>a[j+1]){
// swap(a,j,j+1);
// flag=false;
// }
// }
// if(flag==true){
// break;
// }
// }
// }
/* 选择排序 */
// private static void selectSort(int[] a) {
// for(int i=0;i<a.length-1;i++){
// int k=i;
// for(int j=i+1;j>a.length;j++){
// if(a[j]<a[k]){
// k=j;
// }
// }
// if(k!=i){
// swap(a,i,k);
// }
// }
// }
// private static void insertSort(int[] a) {
// for (int i = 0; i < a.length - 1; i++) {
// int temp = a[i + 1];
// int j = i;
// while (a[j] > temp) {
// a[j + 1] = a[j];
// j--;
// if (j < 0) {
// break;
// }
// }
// a[j = 1] = temp;
// }
//
// }
// // 利用二分法查找的插入排序
// private static void insertSort1(int[] a) {
// for(int i=0;i<a.length-1;i++){
// int temp=a[i+1];
// int low=0;
// int high=i;
// int mid;
// //在low与high之间进行二分查找;找到新的插入元素
// while(low<=high){
// mid=(low+high)/2;
// if(a[mid]>temp){
// high=mid-1;
// }else{
// low=mid+1;
// }
// }
// //经过上面的二查找,得到最新的元素位置是:high+1
// //把[high+1,i]区间内的所有元素往后移动一个位置
// for(int j=i;j>high;j--){
// a[j+1]=a[j];
// }
// a[high+1]=temp;
//
// }
//
// }
// 希尔排序
// private static void shellSort(int[] a) {
// // 进行分组,初始的gap=n/2;然后依次减半,直到最后依次取1
// for (int gap = (a.length + 1) / 2; gap > 0;) {
//
// // 分组冒泡 用冒泡进行优化,否则gap=1本身就是优化
// for (int i = 0; i < a.length - gap; i++) {
// // 组内排序
// for (int j = i; j < a.length - gap; j += gap) {
// if (a[j] > a[j + gap]) {
// swap(a,j,j+gap);
// }
// }
// }
// //for循环的修改有点复杂,直接写在for()里面不方便,因此单独那在这里
// if(gap>1){
// gap=(gap+1)/2;
// }else if(gap==1){
// break;
// }
// }
//
// }
// 快速排序
private static void quickSort(int[] a, int p, int r) {
// TODO Auto-generated method stub
// 把数组划分成:两个数组和一个元素
// a[p:r]==>a[p:q-1],a[q],a[q+1:r]
if (p < r) {
int q = partition(a, p, r);
quickSort(a, p, q - 1);
quickSort(a, q + 1, r);
}
}
private static int partition(int[] a, int p, int r) {
// 快排的优化,随机选取数列中的一个元素当作枢轴,交换到第一个元素的位置
int rand = (int) (Math.random() * (r - p));
swap(a, p, p + rand);
int x = a[p];// 第一元素为枢轴
int i = p;// 在左侧搜索的游标:找大
int j = r + 1;// 在右侧搜索的游戏:找小
while (true) {
while (a[++i] < x && i < r)
;// 在左侧定位到比枢轴大的数
while (a[--j] > x)
;// 在右侧定位倒比枢轴小的数
if (i >= j) {
break;
}
swap(a, i, j);
}
// 把枢轴换到小值区的最后一个元素
swap(a, p, j);
return j;
}
//归并排序
private static void mergeSort(int[] a, int left, int right) {
// TODO Auto-generated method stub
if(left<right){
//1先分解
//把整个数组分解成:[left,mid]和[mid+1,right]
int mid=(left+right)/2;
mergeSort(a,left,mid);//0~4==>mergeSort(a,0,2)和mergeSort(a,3,4)
mergeSort(a,mid+1,right);
//归并排序
int[] b=new int[a.length];
merge(a,b,left,mid,right);
//把辅助序列b中的数据复制到数组a中
copyArray(a,b,left,right);
}
}
private static void merge(int[] a, int[] b, int left, int mid, int right) {
// TODO Auto-generated method stub
int p=left;//游标遍历a[left,mid]
int r=mid+1;//游标,遍历a[mid+1,right]
int k=left;//游标,分解合并后结果数组。指定当前判断之后所选中的元素因该放那个位置
while(p<=mid&&r<=right){
if(a[p]<a[r]){
b[k]=a[p++];
}else{
b[k]=a[r++];
}
k++;
}
//把其中一个子序列当中剩余的元素直接照搬到归并结果数组当中
if(p>mid){//左序列已完成,剩下的是右序列需要照搬
for(int i=r;i<right;i++){
b[k++]=a[i];
}
}else{//右序列已完成,剩下的是左序列需要照搬
for(int i=p;i<=mid;i++){
b[k++]=a[i];
}
}
}
private static void copyArray(int[] a, int[] b, int left, int right) {
// TODO Auto-generated method stub
for(int i=left; i<=right;i++){
a[i] = b[i];
}
}
private static void swap(int[] a, int j, int i) {
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void print(int[] a) {
for (int num : a) {
System.out.print(num + "\t");
}
System.out.println();
}
}