您的位置:首页 > 理论基础 > 数据结构算法

各种排序算法的实现及优化

2017-04-06 16:54 417 查看
import java.util.Random;

public class Sort {

private void swap(int[] arr,int i,int j){
int temp=0;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
/**
* 打印数组
* */
public void print(int[] arr){
for(int a: arr){
System.out.print(a+" ");
}
}
/**
* 冒泡排序
* */
public void maopaoSort(int[] arr, int n){

for(int i=1;i<n;i++){
for(int j=0;j<n-i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
print(arr);
}
/**
* 插入排序
* */
public void insertSort(int[] arr,int n){
//方案一
/*for(int i=1;i<n;i++){
for(int j=i;j>0;j--){
if(arr[j]<arr[j-1]){
swap(arr, j, j-1);
}
}
}*/
//方案二
for(int i=1;i<n;i++){
int t=arr[i];
int j;
for(j=i-1;j>=0&&arr[j]>t;j--){
arr[j+1]=arr[j];
}
arr[j+1]=t;
}
print(arr);
}
/**
* 选择排序
* */
public void selectSort(int[] arr,int n){

for(int i=0;i<n-1;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(arr[min]>arr[j]){
min=j;
}
}
if(min!=i){
swap(arr,min,i);
}
}
print(arr);
}

/**
* 归并排序
* */
public void mergeSort(int[] arr,int n){
mergeSort1(arr,0,n-1);
print(arr);
}

private void mergeSort1(int[] arr, int l, int r) {
if(l>=r){
return;
}
int mid=(l+r)/2;
mergeSort1(arr,l,mid);
mergeSort1(arr,mid+1,r);
merge(arr,l,mid,r);
}

private void merge(int[] arr, int l, int mid, int r) {
int[] temp=new int[r-l+1];

for(int i=l;i<=r;i++){
temp[i-l]=arr[i];
}
int left=0;
int right=mid-l+1;
int m=mid-l;
for(int i=l;i<=r;i++){
if(left>m){
arr[i]=temp[right++];
continue;
}
if(right>temp.length-1){
arr[i]=temp[left++];
continue;
}
if(temp[left]<temp[right]){
arr[i]=temp[left++];
}else{
arr[i]=temp[right++];
}

}

}

public void quickSort(int[]arr,int l,int r){
if(l>=r){
return;
}
//int pivot=partition(arr,l,r); //方案一
int pivot=partition2way(arr,l,r); //方案二
quickSort(arr, l,pivot-1);
quickSort(arr, pivot+1, r);
}
/** 方案一
* 如果重复的太多,会使时间复杂度退化到O(n^2)
* */
private int partition(int[] arr, int l, int r) {
int index=l;
int pivot=arr[l];
for(int i=l+1;i<=r;i++){
if(pivot>arr[i]){
index++;
swap(arr,index,i);
}
}
swap(arr,l,index);
return index;
}

private int partition2way(int[] arr,int l,int r){
int pivot=arr[l];
int i=l+1;
int j=r;

while(true){

while(i<=r && arr[i]<pivot){
i++;
}
while(j>l && arr[j]>pivot){
j--;
}
if(i>j){
break;
}
swap(arr,i,j);
i++;
j--;
}
swap(arr,l,j);
return j;
}
/**
* 三路排序进行优化  <pivot   =pivot   >pivot
* */
private void quickSort3way(int[] arr,int l,int r){

if(l>=r){
return;
}
int pivot=arr[l];
int i=l;
int j=r+1;
int e=l+1;

while(e<r+1){
while(e<=r && pivot>arr[e]){
swap(arr,e,i+1);
e++;
i++;
}
while(e<=r && pivot==arr[e]){
e++;
}
while(j>l+1 && pivot<arr[j-1]){
j--;
}
if(e==j){
break;
}
swap(arr,e,j-1);
}
swap(arr,l,i--);

quickSort3way(arr,l,i);
quickSort3way(arr,j,r);
}

public static void main(String[] args) {
Random random=new Random();

int[] arr=new int[100];

for(int i=0;i<100;i++){
arr[i]=random.nextInt(200);
}

Sort sort=new Sort();
/*sort.quickSort(arrr, 0, arrr.length-1);*/
//sort.quickSort3way(arr, 0, arr.length-1);

sort.print(arr);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息