经典的排序算法

1、冒泡

void BubbleSort(int[]nums,int n){
    for(int i=0;i<a.length;i++){
        flag=0;
        for(int j=0;j<a.length-1-i;j++){
            if(a[j]<a[j+1]){
                int tmp=a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
                flag=1;
            }
         }
         if(flag==0)
             break;
    }
}
//双向冒泡
void BubbleSort(int[]nums,int n){
    int left=0,shift=1,right=b.length-1;
    while(left<right){
        for(int i=left;i<right;i++){
            if(b[i]>b[i+1]){
                int tmp=b[i];
                b[i]=b[i+1];
                b[i+1]=tmp;
                 shift=i;
            }
        }
        right=shift;
        for(int j=right-1;j>=0;j--){
            if(b[j]>b[j+1]){
                int tmp=b[j];
                b[j]=b[j+1];
                b[j+1]=tmp;
                shift=j;
             }
        }
        left=shift;
    }
} 

2、选择排序

void SelectSort(int[] nums,int n) {
        for(int i=0;i<n;i++) {
            int min = i;
            for(int j=i+1;j<n;j++) {
                if(nums[j]<nums[min]) min = j;
               
            }
            if(min!=i){
                swap(nums[i],nums[min]);
            }
        }
    }          

3、快速排序

public int[] sortArray(int[] nums) {
        int low=0,high=nums.length-1;
        quicksort(nums,low,high);
        return nums;
    }
    public void quicksort(int[] nums,int low,int high){
        if(low<high){
            int index=getIndex(nums,low,high);
            quicksort(nums,low,index-1);
            quicksort(nums,index+1,high);
        }
    }
    public int getIndex(int[] nums,int low,int high){
        int temp=nums[low];
        while(low<high){
            while(low<high&&nums[high]>=temp){
                high--;
            }
            nums[low]=nums[high];
            while(low<high&&nums[low]<=temp){
                low++;
            }
            nums[high]=nums[low];
        }
        nums[low]=temp;
        return low;
    }

//快速排序的三位取中法
void swap(int *arr,int left,int right)
{
    int temp;
    temp=arr[left];
    arr[left]=arr[right];
    arr[right]=temp;    
}
//***************************************************************************
int partition(int *arr,int left,int right)
{
    
    //***************************
    //e.g:9,1,5,8,3,7,4,6,2
    int m=left+(right-left)/2;//找到中间的数字的下标
    if(arr[left]>arr[right])//最左大于最右的时候,交换左右
    {
        swap(arr,left,right);
    }
    if(arr[m]>arr[right])//如果中间的>right ,交换
    {
        swap(arr,m,right);
    }
    if(arr[m]>arr[left])//如果中间的>left,交换
    {
        swap(arr,m,right);
    }
    //经过交换之后low变为3
    //****************************
    int temp=arr[left];//基准
    while(left<right)//知道left和right重合的时候,才找到合适的位置
    {     //从后向前找到比小的数字
        while(left<right  &&  arr[right]>=temp)//当right的值大于temp的值的时候才执行
        {
            right--;
        }
        arr[left]=arr[right];//当right的值小于temp的值的时候执行
         while(left<right  && arr[left] <= temp)//从前往后找到比基准大的数字
        {
            left++;
        }
        arr[right]=arr[left];//当left的值大于temp的时候执行
    }
    arr[left]=temp;//此时的left和right在同一个位置,此时为合适的位置,把temp的值给left
    return left;//此时返回的值是temp合适的位置,即小于它的在它的左边,大于它的在它的右边
}

4、堆排序

 1 import java.util.Arrays;
 2 
 3 public class heapSort {
 4     public static void main(String[] args) {
 5         int[] nums =new int[]{2,6,9,0,1,5,7};
 6         Hsort(nums);
 7         System.out.println(Arrays.toString(nums));
 8     }
 9     public static void Hsort(int []nums){
10         for(int i=nums.length/2-1;i>=0;i--){
11             adjust(nums,i,nums.length);
12         }
13         for(int i=nums.length-1;i>=0;i--){
14             int temp=nums[0];
15             nums[0]=nums[i];
16             nums[i]=temp;
17             adjust(nums,0,i);
18         }
19     }
20     public static void adjust(int nums[],int index,int len){
21         int left=index*2+1;
22         int right=left+1;
23         int maxIndex=index;
24         if(left<len&&nums[left]>nums[maxIndex]){
25             maxIndex=left;
26         }
27         if(right<len&&nums[right]>nums[maxIndex]){
28             maxIndex=right;
29         }
30         if(maxIndex!=index){
31             int temp=nums[index];
32             nums[index]=nums[maxIndex];
33             nums[maxIndex]=temp;
34             adjust(nums,maxIndex,len);
35         }
36     }
37 }

 

posted on 2020-03-31 21:28  hdc520  阅读(168)  评论(0编辑  收藏  举报

导航