您的位置:首页 > 编程语言 > Java开发

各类排序算法汇总(java源码)

2018-02-21 19:42 190 查看
**主要内容为(快排、插入排序、选择排序、冒泡、希尔排序、堆排序、归并排序),最下方有swap函数和测试代码(自行根据函数名替换排序算法即可)。**
**快排**————————————————————————————

public static void quicksort(int[] arr,int low,int high){

int tmp;
if(low>=high)return ;
int tag=arr[low];
int left=low;
int right=high;
while(left<right){
while(right>left&&arr[right]>=tag){
right--;
}
while(left<right&&arr[left]<=tag){
left++;
}
if(left<right){
tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
}

}
arr[low]=arr[left];
arr[left]=tag;
quicksort(arr,low,right-1);
quicksort(arr,right+1,high);

}

————————————————————————————————

**插入排序**——————————————————————————

public static void insertsort(int[] arr){
int i;
int j;
for(i=1;i<arr.length;i++){
if(arr[i]<arr[i-1]){
int tmp=arr[i];
for(j=i-1;j>=0&&arr[j]>tmp;j--){
arr[j+1]=arr[j];
}
arr[j+1]=tmp;

}
}

————————————————————————————————————————

**选择排序**——————————————————————————————————

selectsort
public static void selectionsort(int[] arr){
for(int i=0;i<arr.length;i++){
int min=i;
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[min])
min=j;
}
if(min!=i){
int tmp=arr[i];
arr[i]=arr[min];
arr[min]=tmp;
}
}
}

——————————————————————————————————————————

**冒泡**————————————————————————————————————————

public static void bubblesort(int[] arr){
for(int i=0;i<arr.length;i++){
boolean flag=true;
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
flag=false;
}
}
if(flag)
break;
}
}

——————————————————————————————————————————

**希尔排序**——————————————————————————————————

//shellsort
public static void shellsort(int[] arr){
for(int gap=arr.length/2;gap>=1;gap=gap/2){
for(int i=gap;i<arr.length;i++){
int j=i;
//method1  by swap
/* while(j>=gap&&arr[j]<arr[j-gap]){
swap(arr,j,j-gap);
j-=gap;
}*/
//method2 by move
int tmp=arr[i];
while(j>=gap&&arr[j-gap]>tmp){
arr[j]=arr[j-gap];
j-=gap;
}
arr[j]=tmp;
}
}

}

————————————————————————————————————————

**堆排序**————————————————————————————————————

//heapsort
public static void heapsort(int[] arr){
//1.build tree
for(int i =arr.length/2-1;i>=0;i--){

adjust(arr,i,arr.length);
}
for(int j=arr.length-1;j>0;j--){
swap(arr,0,j);
adjust(arr,0,j);  //因为开始建堆时调整使用的是arr.length ,此时j为减一后的“长度”,所以之后均为j即可。
}

}

public static void adjust(int[] arr,int i,int length){

int tmp=arr[i];
for(int j=2*i+1;j<length;j=2*j+1){
if(j+1<length&&arr[j]<arr[j+1]){
j++;
}
if(arr[j]>tmp){
arr[i]=arr[j];
i=j;
}
else{
break;
}

}
arr[i]=tmp;
}

————————————————————————————————————————————

**归并排序**————————————————————————————————————

//mergesort
public static void mergesort(int[] arr){
int[] tmp=new int[arr.length];
sort(arr,0,arr.length-1,tmp);
}
public static void sort(int[]arr,int low,int high,int[] tmp){
if(low>=high)return;
int middle=(low+high)/2;
sort(arr,low,middle,tmp);
sort(arr,middle+1,high,tmp);
merge(arr,low,middle,high,tmp);
}
public static void merge(int[] arr,int low,int middle,int high,int[] tmp){
int a,b,c;
a=low;
b=middle+1;
c=low;
while(a<=middle&&b<=high){
if(arr[a]>arr[b])
{
tmp[c++]=arr[b++];
}
else{
tmp[c++]=arr[a++];
}
}
while(a<=middle){
tmp[c++]=arr[a++];
}
while(b<=high){
tmp[c++]=arr[b++];
}
while(low<=high){
arr[low]=tmp[low];
low++;
}
}

————————————————————————————————————————————

交换函数swap
public static void swap(int[]arr,int a,int b){
arr[a]=arr[a]+arr[b];
arr[b]=arr[a]-arr[b];
arr[a]=arr[a]-arr[b];
}
测试代码
public static void main(String[] args){
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
//1 2 2 3 4 4 7 7  8 9 10 19 62
//  int[] arr = {1,2,3,8,99,54,0,6,8,10,11,15,20};
mergesort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
*本文旨在方便查询浏览,欢迎指正。*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: