排序的工作原理及代码实现总结

1.交换排序

1.1冒泡排序

工作原理:

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

2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

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

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

代码实现:

import java.util.Random;
public class zongjie {
       public static void paixu(int a[]){
           for (int i = 1; i <a.length ; i++) {
               for (int j = 0; j <a.length-i ; j++) {
                   if(a[j]>a[j+1]){
                       int t=a[j+1];
                       a[j+1]=a[j];
                       a[j]=t;
                   }
               }
           }
           for(int i:a){
               System.out.printf("%3d",i);
           }
           System.out.println();
       }
    public static void main(String[] args) {
        Random ra=new Random();
        int a[]=new int[10];
        for (int i = 0; i <a.length ; i++) {
            a[i]=ra.nextInt(20);
        }
        System.out.println("排序前");
        for(int i:a){
            System.out.printf("%3d",i);
        }
        System.out.println();
        System.out.println("排序后");
        paixu(a);

    }
}

1.2快速排序

工作原理:

在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。

        整个快排的过程就简化为了一趟排序的过程,然后递归调用就行了。

        一趟排序的方法:

1,定义i=0,j=A.lenght-1,i为第一个数的下标,j为最后一个数下标

2,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj;

3,从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai;

4,交换Ai 和Aj 

5,重复这个过程,直到 i=j

6,调整key的位置,把A[i] 和key交换

假设要排的数组为:A[8] ={ 5 2 8 9 2 3 4 9 }

           选择 key = 5, 开始时 i=0,j=7

  index       0    1    2    3    4    5    6    7

开始:       5    2    8    9    2    3    4    9

                  i                                         j  

第一次找   5    2    8    9    2    3    4    9

                              i                       j

交换:       5    2    4    9    2    3    8    9 

                              i                       j

第二次找   5    2    4    9    2    3    8    9

                                    i           j

交换:       5    2    4    3    2    9    8    9

                                    i            j

第三次找    5    2    4    3    2    9    8    9

                                          ij   

调整key: 2    5    4    3    5    9    8    9

                                           ij

代码实现:

public class paixu{
      private static void kuaipai(int[] a, int low, int high) {
            //1,找到递归算法的出口
            if( low > high) {
                  return;
            }
            //2, 存
            int i = low;
            int j = high;
            //3,key
            int key = a[ low ];
            //4,完成一趟排序
            while( i< j) {
                  //4.1 ,从右往左找到第一个小于key的数
                  while(i<j && a[j] > key){
                        j--;
                  }
                  // 4.2 从左往右找到第一个大于key的数
                  while( i<j && a[i] <= key) {
                        i++;
                  }
                  //4.3 交换
                  if(i<j) {
                        int p = a[i];
                        a[i] = a[j];
                        a[j] = p;
                  }
            }
            // 4.4,调整key的位置
            int p = a[i];
            a[i] = a[low];
            a[low] = p;
            //5, 对key左边的数快排
            kuaipai(a, low, i-1 );
            //6, 对key右边的数快排
            kuaipai(a, i+1, high);
      }
      public static void main(String[] args){
            int a[]=new int[]{4,5,1,9,3,7,4};
            System.out.println("排序前");
            for(int i:a)
                  System.out.printf("%3d",i);
            System.out.println();
            kuaipai(a,0,6);
            System.out.println("排序后");
            for(int i:a)
                  System.out.printf("%3d",i);
      }
}

2插入排序

2.1简单插入排序

工作原理:

1、从第一个元素开始,该元素可以认为已经被排序。
2、取出下一个元素,在已经排序的元素序列中从后向前扫描。
3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。
4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。
5、将新元素插入到该位置。
6、重复步骤2。

代码实现:

public class zongjie {
    public static void charu(int a[]) {
        // 从数组的第二个元素开始循环将数组中的元素插入
        for (int i = 1; i < a.length; i++) {
            // 设置数组中的第2个元素为第一次循环要插入的数据
            int x = a[i];
            int j = i - 1;
            for (; j >= 0 && a[j] > x; j--) {
                a[j + 1] = a[j];
            }
            // 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
            a[j + 1] = x;
        }
    }
    public static void main(String[] args) {
        int a[]={5,7,9,1,2,0,6,1,7,9,10,3};
        System.out.println("排序前");
        for(int i:a) System.out.printf("%3d",i);
        System.out.println();
        System.out.println("排序后");
        charu(a);
        for(int i:a) System.out.printf("%3d",i);
    }
}

2.2希尔排序

3选择排序

3.1简单选择排序

工作原理:

1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

3)重复第二步,直到所有元素均排序完毕。

代码实现:

public class zongjie {
    public static void xuanzhe(int a[]) {
        int min;
        for (int i = 0; i <a.length-1 ; i++) {
            min=i;
            for (int j = i+1; j <a.length ; j++) {
                if(a[min]>a[j])min=j;
            }
            if(min!=i){
                int t=a[min];
                a[min]=a[i];
                a[i]=t;
            }
        }
    }
    public static void main(String[] args) {
        int a[]={5,7,9,1,2,0,6,1,7,9,10,3};
        System.out.println("排序前");
        for(int i:a) System.out.printf("%3d",i);
        System.out.println();
        System.out.println("排序后");
        xuanzhe(a);
        for(int i:a) System.out.printf("%3d",i);
    }
}

折半查询

工作原理

折半查找又称为二分查找,其要求是数列经过排序的。对于没有经过排序的数列对其进行排序后,然后进行折半查找操作。

譬如数组{1,2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:

1).第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,

2)寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。

二分查找算法就是不断将数组进行对半分割,每次拿中间元素和目标数据进行比较。

代码实现:

import java.util.Scanner;

public class zongjie {
    public static int zheban(int a[],int x) {
        int left=0;
        int right=a.length-1;
        int mid;
        while(left<=right){
            mid=(left+right)/2;
            if(a[mid]==x)return mid;
            else if(a[mid]<x)left=mid+1;
            else right=mid-1;
        }
        return -1;
    }
    public static void main(String[] args) {
          int a[]={1,2,3,4,5,6,7,8,9,10};
        Scanner sc=new Scanner(System.in);
        System.out.println("输入待查找的数");
        int x=sc.nextInt();
        System.out.println(zheban(a,x));
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42770460/article/details/81172231
今日推荐