zoukankan      html  css  js  c++  java
  • 冒泡排序,选择排序,插入排序,归并排序

     1.冒泡排序

    冒泡排序的思想,将数组分为已排(右边)和未排(左边)两部分。排序时每次在未排部分从左向右一次比较相邻2个元素,如果左大于右则互换位置。

    每次都是指针从左边第一个依次相邻比较,到指针指向倒数第二个未排结束比较。

        @Test
        //冒泡排序
        public void fun4(){
            int[] arr={4,3,2,1,7,90,45,56,34,23,67,67,34,23,13,23};
            int left=0;//数组起始索引
            int right=arr.length-1;//数组末尾索引
            int temp=0;
            for(int i=right;i>left;i--){
                for(int j=left+1;j<=i;j++){
                    if(arr[j-1]>arr[j]){
                        temp=arr[j-1];
                        arr[j-1]=arr[j];
                        arr[j]=temp;
                    }
                }
            }
            System.out.println(Arrays.toString(arr));
        }

     时间复杂度为O(n^2),(n为数组元素个数,复杂度为循环执行比较的次数);

    2.选择排序

    选择排序思想,将数组分为已排(左边)和未排(右边)两部分。排序时每次在待排部分选择一个最小值并与待排的第一个元素互换,然后已排部分向右扩充一个成员。

        @Test
        //选择排序
        public void fun5(){
            int[] arr={4,3,2,1,7,90,45,56,34,23,67,67,34,23,73,23};
            int left=0;//数组起始索引
            int right=arr.length-1;//数组末尾索引
            for(int i=left;i<right;i++){
                int p=i;
                for(int j=i+1;j<=right;j++){
                    if(arr[j]<arr[p]){
                        p=j;
                    }
                }
                if(p!=i){
                    int temp=arr[i];
                    arr[i]=arr[p];
                    arr[p]=temp;
                }
            }
            System.out.println(Arrays.toString(arr));
        }

     3.插入排序

    插入排序,分为已排(左边)和未排(右边),排序开始时数组第一个元素为已排部分,右边为未排。

        @Test
        //插入排序
        public void fun6(){
            int[] arr={4,3,2,1,7,90,45,56,34,23,67,67,34,23,73,23};
            int left=0;//数组起始索引
            int right=arr.length-1;//数组末尾索引
            for(int i=left+1;i<=right;i++){
                int val=arr[i];//取出待排的第一个
                int j=i;
                while(j >left && val<arr[j-1]){//将待排数据向左(已排数据)依次比较
                    arr[j]=arr[j-1];//如果已排数据都大于待排数,将已排数据依次向右位移一位
                    j--;
                }
                arr[j]=val;//直到跳出循环将缓存的待排数据放到位移后留下的空位
            }
            System.out.println(Arrays.toString(arr));
        }

     4.归并排序

    public class MergeSort {
        //两路归并算法,两个排好序的子序列合并为一个子序列
        public void merge(int []a,int left,int mid,int right){
            int []tmp=new int[a.length];//辅助数组
            int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针
    
            while(p1<=mid && p2<=right){
                if(a[p1]<=a[p2])
                    tmp[k++]=a[p1++];
                else
                    tmp[k++]=a[p2++];
            }
            while(p1<=mid) tmp[k++]=a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
            while(p2<=right) tmp[k++]=a[p2++];//同上
    
            //复制回原素组
            for (int i = left; i <=right; i++) 
                a[i]=tmp[i];
        }
        public void mergeSort(int [] a,int start,int end){
            if(start<end){//当子序列中只有一个元素时结束递归
                int mid=(start+end)/2;//划分子序列
                mergeSort(a, start, mid);//对左侧子序列进行递归排序
                mergeSort(a, mid+1, end);//对右侧子序列进行递归排序
                merge(a, start, mid, end);//合并
            }
        }
        @Test
        public void test(){
            int[] a = { 49, 38, 65, 97, 76, 13, 27, 50 };
            mergeSort(a, 0, a.length-1);
            System.out.println("排好序的数组:");
            for (int e : a)
                System.out.print(e+" ");
        }
    }
  • 相关阅读:
    LwIP应用开发笔记之六:LwIP无操作系统TCP客户端
    LwIP应用开发笔记之五:LwIP无操作系统TCP服务器
    LwIP应用开发笔记之四:LwIP无操作系统TFTP服务器
    幸运与不幸
    LwIP应用开发笔记之三:LwIP无操作系统UDP客户端
    LwIP应用开发笔记之二:LwIP无操作系统UDP服务器
    【文学】暖泉古镇
    Docker创建JIRA 7.2.4中文破解版
    cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台
    Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
  • 原文地址:https://www.cnblogs.com/mryangbo/p/10673480.html
Copyright © 2011-2022 走看看