zoukankan      html  css  js  c++  java
  • 排序(1)

    排序(1)

    @(数据结构与算法)

    基本排序算法的时间复杂度

    如何分析排序算法

    时间复杂度,空间复杂度,稳定性

    冒泡排序

    Java 代码如下:

    //a 表示数组,n 表示数组大小
    public void bubbleSort(int[] a,int n){
    	if n <= 1 return;
    	for(int i =0;i <n; ++i){
    		// 提前退出冒泡循环的标志位
    		boolean flag = false;
    		for(int j=0;j<n-i-1;j++){  //由于函数中有 j+1 ,所以此处为 n-i-1
    			if(a[j] > a[j+1]){
    				int temp = a[j];
    				a[j] = a[j+1];
    				a[j+1] = temp;
    				flag = true;
    			}
    		}
    		if (!flag) break;
    	}
    }
    

    时间复杂度$O(n^2)$,空间复杂度 $O(1)$ 稳定


    插入排序

    Java 代码

    // 插入排序,a 表示数组,n 表示数组大小
    public void insertionSort(int[] a, int n) {
      if (a == null  || a.length() <2) return;
      for (int i = 1; i < n; i++) {
        // 查找插入的位置
        for ( int j = i - 1; j >= 0; j--) {
          if (a[j] > a[j+1]) {
            int temp = a[j];
            a[j] = a[j+1];
            a[j+1] = temp;
          } else {
            break;
          }
        }
      }
    }
    
    

    时间复杂度$O(n^2)$,空间复杂度 $O(1)$ 稳定


    选择排序

    java 代码

    public static void selectionSort(int[] arr) {
    		if (arr == null || arr.length < 2) {
    			return;
    		}
    		for (int i = 0; i < arr.length - 1; i++) {
    			int minIndex = i;
    			for (int j = i + 1; j < arr.length; j++) {
    				minIndex = arr[j] < arr[minIndex] ? j : minIndex;
    			}
    			swap(arr, i, minIndex);
    		}
    	}
    	
    public static void swap(int[] arr, int i, int j) {
    		int tmp = arr[i];
    		arr[i] = arr[j];
    		arr[j] = tmp;
    	}
    
    

    时间复杂度$O(n^2)$,空间复杂度 $O(1)$ 不稳定


    归并排序

    public static void mergeSort(int[] arr) {
    		if (arr == null || arr.length < 2) {
    			return;
    		}
    		process(arr, 0, arr.length - 1);
    	}
    
    public static void process(int[] arr, int l, int r) {
    		if (l == r) {
    			return;
    		}
    		int mid = l + ((r - l) >> 1);
    		process(arr, l, mid);
    		process(arr, mid + 1, r);
    		merge(arr, l, mid, r);
    	}
    
    public static void merge(int[] arr, int l, int m, int r) {
    		int[] help = new int[r - l + 1];
    		int i = 0;
    		int p1 = l;
    		int p2 = m + 1;
    		while (p1 <= m && p2 <= r) {
    			help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
    		}
    		while (p1 <= m) {
    			help[i++] = arr[p1++];
    		}
    		while (p2 <= r) {
    			help[i++] = arr[p2++];
    		}
    		for (i = 0; i < help.length; i++) {
    			arr[l + i] = help[i];
    		}
    	}
    

    时间复杂度$O(n*logn)$,空间复杂度 $O(n)$ ,稳定

  • 相关阅读:
    团队项目-选题报告
    第一次结对编程作业
    第一次个人编程作业
    软工作业1
    总结
    2013-2014 ACM ICPC Central European Regional Contest (CERC 13) K-Digraphs
    2018CCPC吉林赛区 F
    计蒜客-A1594 封印之门
    HDU-1599 find the mincost route
    POJ-2240 Arbitrage
  • 原文地址:https://www.cnblogs.com/wobu/p/9839564.html
Copyright © 2011-2022 走看看