package Sort;
public class SortMethods {
public static void main(String[] args) {
int a[]={51,56,86,99,-2,5,4,9,3};
//1.第一种排序,比较简单,冒泡排序
//bubbleSort(a);
//bubbleSort2(a);
//2.选择排序,先遍历一遍,把最大的数的位置找出来,放在最后一个位置,即a[a.length-1]
//selectSort(a);
//3.插入排序,即检查第i个数字,如果左边的数字比他大,进行交换,直到左边数字比他小,就停止
//insertSort(a);
//4.希尔排序,记录按下标的一定增量(以下用gap表示)分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,
//当增量减至1时,整个文件恰被分成一组,算法便终止
//shellSort(a);
//5.快速排序(这个是经常会用到的排序算法,可以排那种很多数据的算法),首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,
//然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
quickSort(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-1-i;j++){
if(a[j]>a[j+1]){
swap(a,j,j+1);
}
}
}
print(a);
}
//优化之后的冒泡排序
private static void bubbleSort2(int a[]){
for(int i=0;i<a.length-1;i++){
boolean flag=true;
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
swap(a, j, j+1);
flag=false;
}
}
if(flag==true){
break;
}
}
print(a);
}
//选择排序的代码
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[k]>a[j]){
k=j;
}
}
if(k!=i){
swap(a, i, k);
}
}
print(a);
}
//插入排序的代码
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]; //把a[j]放在a[j+1]的位置上
j--; //j-1,继续和左边的数比较
if(j<0){
break;
}
}
a[j+1]=temp;
}
print(a);
}
//希尔排序
private static void shellSort(int a[]){
for(int gap=(a.length+1)/2;gap>0;){ //此处用gap表示shell排序中的增量
//接下来用冒泡的排序算法一步步排下去
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);
}
}
}
if(gap>1){
gap=(gap+1)/2;
}else if(gap==1){
break;
}
}
print(a);
}
//快速排序算法,主要思想就是把一个组分成两个组,以第一个数字为界,左边放比他小的数,右边放比他大的数
public static void quickSort(int a[],int s,int e){ //此处s表示第一个数字的下标,e表示最后一个数字下标
if(s<e){
////把数组划分成:两个子数组和一个元素
// a[s:e] ==> a[s:q-1], a[q], a[q+1:e]
int q=partition(a,s,e);
quickSort(a, s, q-1);
quickSort(a, q+1, e);
}
}
private static int partition(int a[], int s, int e) {
int rand = (int)(Math.random()*(e-s));
swap(a,s,s+rand);
int x=a[s]; //第1个元素为枢轴
int i=s;
int j=e+1;
while(true){
while(a[++i]<x&&i<e);//在左侧定位到比枢轴大的数
while(a[--j]>x);//在右侧定位到比枢轴小的数
if(i>=j){
break;
}
swap(a, i, j);
}
swap(a,s,j);
return j;
}
//交换方法
private static void swap(int a[],int j,int i){
a[j]=a[i]^a[j];
a[i]=a[i]^a[j];
a[j]=a[i]^a[j];
}
//输出的方法
private static void print(int a[]){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
}
此处写了5种比较常用的排序方式,冒泡排序,选择排序,插入排序,希尔排序和快排,灵活运用,基本methods就是上面的代码,万变不离其宗。