java数据结构 3++排序算法小结

成员变量a[ ]: 

static int[] a;

 测试方法

public static void main(String[] args) {
        System.out.println("冒泡排序:");
        Bubble_Sort();
        foreach(a);
        System.out.println("选择排序:");
        Selection_sort();
        foreach(a);
        System.out.println("快速排序:");
        a=new int[]{45,78,99,6,4,57,35,2,2,99,57};
        quick_sort(0,a.length-1);
        foreach(a);
        System.out.println("直接插入排序:");
        insert();
        foreach(a);
        System.out.println("希尔排序:");
        ShellSort();
        foreach(a);
        System.out.println("二分法查找:");
        System.out.println("所在下标为:"+search(35,0,a.length));
    }

 冒泡排序:

原理:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

static void Bubble_Sort(){
        a=new int[]{45,78,99,6,4,57,35,2,2,99,57};
        for (int i = 0; i < a.length-1; i++) {
            for (int j = 0; j <a.length-i-1; j++) {
                if (a[j]>a[j+1]){
                    a[j]=a[j+1]+(a[j+1]=a[j])*0;
                }
            }
        }
    }

选择排序: 

原理:初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

static void Selection_sort(){
        a=new int[]{45,78,99,6,4,57,35,2,2,99,57};
        for (int i = 0; i < a.length-1; i++) {
            for (int j = i+1; j < a.length; j++) {
                if(a[i]>a[j]){
                    a[i]=a[j]+(a[j]=a[i])*0;
                }
            }
        }
    }

快速排序: 

原理:快速排序(Quicksort)是冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

static void quick_sort(int left,int right){
        //循环出口
        if(left>right)
            return;
        //储存变量
        int temp=a[left],m=left,n=right;
        //交换把所有小的放左边大的放右边
        while(m<n){
            while (a[n] >= temp && m < n) n--;
            //小的放左边
            a[m] = a[n];
            while (a[m] <= temp && m < n) m++;
            //大的放右边
            a[n] = a[m];
        }
        //第一个数放中间
        a[m] = temp;
        //对两块分别继续执行以上代码
        quick_sort(left,m-1);
        quick_sort(m+1,right);
    }

 直接插入排序:

原理:

直接插入排序是将待排序数组依次插入已经排序数组。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。

static void insert(){
        a=new int[]{45,78,99,6,4,57,35,2,2,99,57};
        //从左向右移动标志
        for (int i = 0; i < a.length-1; i++) {
            //当前标志位(标志位之前都已经排好序)
            int j = i;
            //待插入的数据
            int temp=a[j+1];
            //从标志位向左依次与带插入数据比较 大于带插入数据的向右移动
            for (; j>=0&&a[j]>temp; j--) {
                a[j+1]=a[j];
            }
            //将待插入数据插入空位
            a[++j]=temp;
        }
    }

 希尔排序:

原理:

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 

static void ShellSort(){//希尔排序是直接插入排序的升级版
        a=new int[]{45,78,99,6,4,57,35,2,2,99,57};
        //这是希尔不同于直接插入排序的地方 即分组进行直接插入排序
        //以gap长度为一组
        for(int gap=a.length/2;gap>0;gap/=2){//gap进行逐步缩小
            //从第gap个元素,逐个对其所在组进行直接插入排序操作
            //等同于插入排序的第i个元素
            for(int i=gap;i<a.length;i++){
                int j = i-gap;
                int temp = a[j];
                for(;j>=0 && temp<a[j];j-=gap){
                    //向右移动数据
                    a[j+gap] = a[j];
                }
                a[j+gap] = temp;
            }
        }
    }

 打印方法:

static void foreach(int[] a){
        for (int i:a) {
            System.out.print(i+" ");
        }
        System.out.println();
}

折半查找: 

原理: 

对有序数列进行查找,分成两块,去掉待查找数字不存在的另一块,直到待查找数字等于中间数字。

static int search(int num,int left,int right){
        if(left>right)return -1;
        int d=(left+right)/2;
        if(num==a[d])return d;
        if(num>a[d])return search(num,d+1,right);
        else return search(num,left,d-1);
}

运行结果: 

冒泡排序:
2 2 4 6 35 45 57 57 78 99 99 
选择排序:
2 2 4 6 35 45 57 57 78 99 99 
快速排序:
2 2 4 6 35 45 57 57 78 99 99 
直接插入排序:
2 2 4 6 35 45 57 57 78 99 99 
希尔排序:
2 2 4 6 35 45 57 57 78 99 99 
二分法查找:
所在下标为:4

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/joob000/article/details/81179310