基本排序算法

二分查找

public class BinarySearch {
    public int binarySearch(int[] a,int result)
    {
        int len=a.length;
        int left=0;
        int right=len-1;
        int mid;
        while (left<=right)
        {
            mid=(left+right)/2;
            if(a[mid]<result)
            {
                left=mid+1;
            }
            else if(a[mid]>result)
            {
                right=mid-1;
            }
            else {
                return mid;
            }

        }
        return -1;
    }
}

冒泡排序

public class BubbleSort {
    public void BubbleSort(int[] a)
    {
        for(int i=0;i<a.length;i++)
            for(int j=1;j<a.length-i;j++)
            {
                if(a[j-1]>a[j])
                {
                    int temp=a[j];
                    a[j]=a[j-1];
                    a[j-1]=temp;
                }
            }
    }
    public void BubbleSort2(int[] a)
    {
        for(int i=0;i<a.length;i++)
        {
            int flag=0;
            for(int j=1;j<a.length-i;j++)
            {
                if(a[j-1]>a[j])
                {
                    flag=1;
                    int temp=a[j];
                    a[j]=a[j-1];
                    a[j-1]=temp;
                }
            }
            if(flag==0)
            {
                return;
            }
        }
    }

}

插入排序

public class InsertSort {
    //插入排序.比较和移动同时进行
    public void insertSort(int[] a)
    {
        if(a==null)
        {
            return;
        }
        for(int i=1;i<a.length;i++)
        {
            int temp=a[i];
            int j=i-1;
            while (j>=0&&temp<a[j]){
                a[j+1]=a[j];
                j--;
            }
            a[j+1]=temp;
        }
    }
//折半插入排序
    public void binaryInsertSort(int[] a)
    {
        int len=a.length;
        int mid;
        int target;
        for (int i=1;i<len;i++)
        {
            int left=0;
            int right=i-1;
            target=a[i];
            //出了while循环后left索引的值一定大于等于target,right的值一定小于等于target
            while (left<=right)
            {
                mid=(left+right)/2;
                if(target<a[mid])
                {
                    right=mid-1;

                }
                if(target>=a[mid])
                {
                    left=mid+1;
                }
            }
            for(int j=i-1;j>=left;j--)
            {
                a[j+1]=a[j];
            }
            a[left]=target;
        }
    }

#

public void merge(int[] data,int start,int mid,int end)
    {
        //如果想将只含有两个元素的数组分成两部分,左边数组的长度需按一下方式写,如果之后的mid=(right+left)/2;
        //归并的思想是将两个有序的子序列归并成一个有序的序列
        int len1=mid-start+1;
        int len2=end-mid;
        int[] left=new int[len1];
        int[] right=new int[len2];
        for(int i=0;i<len1;i++)
        {
            left[i]=data[start+i];
        }
        for(int i=0;i<len2;i++)
        {
            right[i]=data[mid+1+i];
        }
        int i=0,j=0;
        int k;
        for(k=start;k<end;k++)
        {
            if(i==len1||j==len2)
            {
                break;
            }
            if(left[i]<=right[j])
            {
                data[k]=left[i++];
            }
            else
            {
                data[k]=right[j++];
            }
        }
        while (i<len1)
        {
            data[k++]=left[i++];
        }
        while (j<len2)
        {
            data[k++]=right[j++];
        }
    }
    public void merge(int[] a,int start,int end)
    {
        int mid=(start+end)/2;
        int len1=mid-start+1;
        int len2=end-mid;
        int[] left=new int[len1];
        int[] right=new int[len2];
        for(int i=0;i<len1;i++)
        {
            left[i]= a[start+i];
        }
        for (int i=0;i<len2;i++)
        {
            right[i]=a[mid+1+i];
        }
        int i=0,j=0,k=0;
        for(k=start;k<end;k++)
        {
            if(i==len1||len2==len2)
            {
                break;
            }
            if(left[i]<=right[j])
            {
                a[k]=left[i++];
            }else {
                a[k]=right[j++];
            }
        }
        while (i<len1)
        {
            a[k++]=left[i++];
        }
        while (j<len2)
        {
            a[k++]=right[j++];
        }
    }
    public void mergeSort(int[] data,int start,int end)
    {
        //将数组元素分解到只剩下两个元素,肯定是可以执行归并的.
        if(start<end)
        {
            int mid=(start+end)/2;
            mergeSort(data,start,mid);
            mergeSort(data,mid+1,end);
            merge(data,start,end);
        }
    }

快速排序

public class QuickSort {
    public int partition(int[] a,int left,int right)
    {
        int pivot=a[left];
        //跳出循环时left==right

        while (left<right)
        {
            pivot=a[left];
            while (left<right&&a[left]<pivot)
            {
                left++;
            }
            a[right]=a[left];
            while (left<right&&a[right]>pivot)
            {
                right--;
            }
            a[left]=a[right];

        }
        a[left]=pivot;
        return left;
    }
    public void QuickSort(int[] a,int left,int right)
    {
        if(left<right)
        {
            int p=partition(a,left,right);
            QuickSort(a,left,p-1);
            QuickSort(a,p+1,right);
        }
    }

选择排序

public class SelectionSort {
    //每次遍历都选择最小的元素放在合适的位置
    public void selectionSort(int[] a)
    {
        for (int i=1;i<a.length;i++)
        {
            int min=i-1;
            for(int j=min;j<a.length;j++)
            {
                if(a[min]>a[j])
                {
                    min=j;
                }
            }
            if(min!=i-1)
            {
                int temp=a[i-1];
                a[i-1]=a[min];
                a[min]=temp;
            }
        }
    }

    @Test
    public void test()
    {
        int[] a={5,3,2,1,0};
        String arraystring= Arrays.toString(a);

        System.out.print(arraystring);

        arraystring= Arrays.toString(a);

        System.out.print(arraystring);


    }
}

希尔排序

public class ShellSort {
    public void shellSort(int[] a)
    {
        int d=a.length/2;
        while (d>=1)
        {
            for (int k=0;k<d;k++)
            {
                for (int i=k+d;i<a.length;i+=d)
                {
                    int temp=a[i];
                    int j=i-d;
                    while (j>=k&&a[j]>temp)
                    {
                        a[j+d]=a[j];
                        j-=d;
                    }
                    a[j+d]=temp;
                }
            }
            d=d/2;
        }

    }

}
点赞