欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

几个排序算法(java版)

程序员文章站 2022-03-08 16:26:39
...
//改进的冒泡算法
public class 改进的冒泡算法 {
public static void main(String args[]){
	int a[]={2,6,4,3,28,9,43,21,89,23};
	bubblesort(a);
	for(int i=0;i<a.length;i++){
		System.out.print(a[i]+" ");
	}
}
public static void bubblesort(int arr[]){
	boolean b =false;
	int temp;
	for(int i = 1;i<arr.length;i++){       //下标从第二个数开始,所以是1
		b=false;
		for(int j=arr.length-1;j>=i;j--){
			if(arr[j]<arr[j-1]){                //满足条件时,交换
				temp = arr[j];
				arr[j]=arr[j-1];
				arr[j-1]=temp;
				b = true;                     
			}
		}
		if(!b){
			break;
		}
	}
	
}
}

//快速排序算法1
public class 快速排序算法 {
public static void main(String args[]){
	int a[]={23,6,7,88,76,65,44,338,59};
	quicksort(a,0,a.length-1);
	for(int i=0;i<a.length;i++){
		System.out.print(a[i]+" ");
	}
}

public static  void quicksort(int arr[],int low,int high){
	int i,j,k;                          //三剑客的约定
	if(low<high){                  //先决条件
		i = low;
		j = high;
		k= arr[i];                   //找到适合位置
		while(i<j){              
			while(i<j&&arr[j]>k){
				j--;
			}
			if(i<j){
				arr[i]=arr[j];
				i++;
			}
			while(i<j&&arr[i]<k){
				i++;
			}
			if(i<j){
				arr[j]=arr[i];
				j--;
			}
		}
		arr[i]=k;                          //装到适合的位置
		quicksort(arr,low,i-1);      //递归
		quicksort(arr,i+1,high);   //递归
	}
}
}

//快速排序算法2
public class 快速排序2 {
public static void main(String ag[]){
	int a[]={23,6,7,88,76,65,44,338,59};
	quicksort2(a,0,a.length-1);
	for(int i=0;i<a.length;i++){
		System.out.print(a[i]+" ");
	}
}


public static void quicksort2(int arr[],int low,int high){
	 if(low<high){                                       //条件
		 int i=partion(arr,low,high);               //合适位置的获得 
			quicksort2(arr,low,i-1);
			quicksort2(arr,i+1,high);
	 }
}
public static int partion(int arr[],int low,int high){          //目的是找到一个合适的位置和置一个数!
	int temp = arr[low];                                                   //得到要置的数
	if(low<high){
		int k=arr[low];
		int mid=(low+high)/2;
		
		while(low<high&&k<arr[high]){
			high--;
		}
		if(low<high){
			arr[low]=arr[high];
			low++;
		}
		while(low<high&&k>arr[low]){
			low++;
		}
		if(low<high){
			arr[high]=arr[low];
			high--;
		}
	}
	arr[low]=temp;                                           //置数
	return low;
}
}

//归并排序
public class 归并排序算法 {

	public static void main(String[] args) {
		int a[]={23,6,7,88,76,65,44,338,59};
		mergesort(a,0,a.length-1);
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
	}
   
	public static void mergesort(int arr[],int start,int end){     //主函数
		if(start<end){
			int mid = (start+end)/2;                 //关键一步
			mergesort(arr,start,mid);                //递归
			mergesort(arr,mid+1,end);             //递归
			merge(arr,start,mid,mid+1,end);     //调用下面的函数
		}
	}
	public static void merge(int arr[],int start1,int end1,int start2,int end2){        //被调用的函数
		int i , j, k=0;                                         //临时变量的使用
		i = start1;
		j=start2;
		int temp[] = new int[end2-start1+1];    //临时数组的大小规格
		while(i<=end1&&j<=end2){
		     if(arr[i]>arr[j]){
		    	 temp[k++]=arr[j++];
		     }else {
		    	 temp[k++]=arr[i++];
		     }
		}
		//把剩下的元素依次放入临时数组中
		while(i<=end1){
			temp[k++]=arr[i++];
		}
		while(j<=end2){
			temp [k++]=arr[j++];
		}
		//归还到原来的数组中去
		k = start1;
		for(int element :temp){
			arr[k++]=element;
		}
	}
}