数据结构与算法-排序算法-(堆排、快排、归并)

1、排序算法

1.1 快速排序

快排的时间复杂度是O(nlogn)
其实现思想就是随机找到一个中间值 小于这个值得放左边 大于这个值得放右边 
然后大于这个值得半部分和小于这个值得半部分分别递归
直到全部排完
jdk1.8中的Arrays.sort()的排序方法就是使用的快排 当数据量大于47的时候采用快排
小于47的时候使用插排
实现代码:
       public class QuickSort {

		    /**
		     * 递归 进行排序
		     * @param arr
		     * @param left
		     * @param right
		     */
		    public static void quickSort(int [] arr , int left, int right){
		        //递归终止条件
		        if (left < right){
		            swap(arr,left + ((right - left ) >> 1),right);
		            int [] p = partition(arr,left,right);
		
		            //等于区域的左边界递归(小于区域所有值)
		            quickSort(arr,left,p[0] -1);
		
		            //等于区域的右边界递归(大于区域所有值)
		            quickSort(arr,p[1]+1,right);
		        }
		    }
		
		    /**
		     * 划分数组的partition过程  时间复杂度为O(n)  返回的为等于区域的左右边界
		     * @param arr
		     * @param left
		     * @param right
		     * @return
		     */
		    private static int[] partition(int[] arr, int left, int right) {
		
		        int less  = left - 1;
		        int more = right;
		        while (left < more){
		            if (arr[left] < arr[right]){
		                swap(arr, ++less, left++);
		            }else if (arr[left] > arr[right]){
		                swap(arr,--more, left);
		            }else {
		                left++;
		            }
		        }
		        swap(arr,more,right);
		        return new int [] {less +1 ,more};
		    }
		
		
		    private static void swap(int[] arr, int j, int i) {
		
		        int temp = arr[j];
		        arr[j] = arr[i];
		        arr[i] = temp;
		    }
		
		    public static void main(String[] args) {
		        int[] arr = ArrayUtils.getArray(10,20);
		        ArrayUtils.printArray(arr);
		        quickSort(arr,0,arr.length -1);
		        System.out.println();
		        ArrayUtils.printArray(arr);
		    }
}

1.2 堆排

堆排就是建立一个抽象意义上的堆、算法上的堆是一个完全二叉树结构。
其底层是一个数组,一个节点的左孩子是 index * 2 + 1
右孩子是 index * 2 + 2
父亲节点是 (index - 1)/ 2
大根堆就是在以当前节点作为一个树的时候、此节点是整棵树中的最大值(小根堆反之)。
堆排序主要分为两步:
    1、建立一个堆,然后每次将堆顶的元素和最后一层的最后一个元素交换。
    2、然后将堆顶的元素进行下沉,直到以他为树的所有节点中只有他最大(小)。

堆排时间复杂度是严格意义上的O(nlogn) 空间复杂度是O(1)

堆排的应用如优先级队列等。
	        public class HeapSort {
	
	            public static void heapSort(int [] arr){
	                if (arr == null || arr.length < 2){
	                    return;
	                }
	                //建立大根堆 每个节点是整个子树中的最大值
	                for (int i = 0 ; i < arr.length ; i++){
	                    heapInsert(arr,i);
	                }
	                int size = arr.length;
	                swap(arr,0,--size);
	                while (size > 0){
	                    heapify(arr,0,size);
	                    swap(arr,0,--size);
	                }
	            }
	        
	            /**
	             * 下沉的过程
	             * @param arr
	             * @param index
	             * @param size
	             */
	            private static void heapify(int[] arr, int index, int size) {
	                int left = index * 2 +1;
	                while (left < size){
	        
	                    //如果左右孩子都存在 选最大的  作为largest
	                    int largest = left + 1 < size && arr[left + 1] > arr[left] ? left +1 : left;
	                    //largest变为 自己和左右孩子中最大的值
	                    largest = arr[largest] > arr[index] ? largest : index;
	                    if (largest == index){
	                        break;
	                    }
	                    swap(arr,largest,index);
	                    index = largest;
	                    left = index * 2 +1;
	                }
	        
	            }
	        
	            /**
	             * 从index位置开始进行与父节点的比较 直到不比父节点大 或者到0的位置停止
	             * @param arr
	             * @param index
	             */
	            private static void heapInsert(int[] arr, int index) {
	        
	                while (arr[index] > arr[(index - 1 ) / 2]){
	                    swap(arr,index,(index -1 ) / 2 );
	                    index = (index -1 ) / 2;
	        
	                }
	            }
	        
	        
	        
	            private static void swap(int[] arr, int j, int i) {
	        
	                int temp = arr[j];
	                arr[j] = arr[i];
	                arr[i] = temp;
	            }
	        
	            public static void main(String[] args) {
	                int[] arr = ArrayUtils.getArray(10,20);
	                ArrayUtils.printArray(arr);
	                heapSort(arr);
	                System.out.println();
	                ArrayUtils.printArray(arr);
	            }
	
	    }  

1.3 归并排序

归并排序就是将数组递归的两两划分、然后再合并的过程 在合并的过程中排好序
递的过程就是将数组从中间分成两半、直到数组大小为1,
归的过程就是讲两部分合成成一个部分,合成的过程中排好序
时间复杂度O(nlogn)
        public class MergeSort {

            public static void mergeSort(int[] arr) {
                if (arr.length < 2 || arr == null) {
                    return;
                }
                mergeSort(arr, 0, arr.length - 1);
        
            }
        
            private static void mergeSort(int[] arr, int left, int right) {
        
                if (left == right) {
                    return;
                }
                //left 和right的中间位置
                int mid = left + ((right - left) >>> 1);
                //左半部分递归
                mergeSort(arr, left, mid);
                //右半部分递归
                mergeSort(arr, mid + 1, right);
                //最后再合并
                merge(arr, left, mid, right);
        
            }
        
            /**
             * 合并 l 到 r上以 mid 为划分点的两部分的元素
             *
             * @param arr
             * @param left
             * @param mid
             * @param right
             */
            private static void merge(int[] arr, int left, int mid, int right) {
                int[] help = new int[right - left + 1];
                int i = 0;
                int leftPoint = left;
                int rightPoint = mid + 1;
                while (leftPoint <= mid && rightPoint <= right) {
                    help[i++] = arr[leftPoint] < arr[rightPoint] ? arr[leftPoint++] : arr[rightPoint++];
                }
                while (leftPoint <= mid) {
                    help[i++] = arr[leftPoint++];
                }
                while (rightPoint <= right) {
                    help[i++] = arr[rightPoint++];
                }
                //将数组拷贝回原数组
                for (i = 0; i < help.length; i++) {
                    arr[left + i] = help[i];
                }
            }
        
            public static void main(String[] args) {
                int[] arr = ArrayUtils.getArray(10, 20);
                ArrayUtils.printArray(arr);
                mergeSort(arr, 0, arr.length - 1);
                System.out.println();
                ArrayUtils.printArray(arr);
            }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值