yishujixiaoxiao 2020-02-12
//冒泡排序 O(n2) public static void BubbleSort(int[] arr){ int temp; for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } //冒泡排序优化 O(n2) public static void BubbleSort1(int[] arr){ int temp; boolean flag; for(int i=0;i<arr.length-1;i++){ flag = false; for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; flag = true; } } if(!flag) break; } }
//选择排序 O(n2) public static void select_sort(int[] arr){ int temp; for(int i=0;i<arr.length-1;i++){ int minIndex = i; for(int j=i+1;j<arr.length;j++){ if(arr[j]<arr[minIndex]){ minIndex = j; } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } }
//插入排序 O(n2) public static void insert_sort(int[] arr){ int temp; for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j>0;j--){ if(arr[j]<arr[j-1]){ temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; }else break; } } }
//希尔排序 public static void shell_sort(int[] arr){ int temp; for(int step = arr.length/2;step>0;step/=2){//步长 for(int i=0;i<step;i++){//划分子序列 //插入排序 for(int j=i+step;j<arr.length;j+=step){ for(int k=j;k>i;k-=step){ if(arr[k]<arr[k-step]){ temp = arr[k]; arr[k] = arr[k-step]; arr[k-step] = temp; }else break; } } } } }
//快速排序 public static void quick_sort(int[] arr,int low,int high){ int i,j,temp,t; if(low>high){ return; } i=low; j=high; //temp就是基准位 temp = arr[low]; while (i<j) { //先看右边,依次往左递减 while (temp<=arr[j]&&i<j) { j--; } //再看左边,依次往右递增 while (temp>=arr[i]&&i<j) { i++; } //如果满足条件则交换 if (i<j) { t = arr[j]; arr[j] = arr[i]; arr[i] = t; } } //最后将基准为与i和j相等位置的数字交换 arr[low] = arr[i]; arr[i] = temp; //递归调用左半数组 quick_sort(arr, low, j-1); //递归调用右半数组 quick_sort(arr, j+1, high); }
//归并算法(逻辑) public static void merge_sort(int[] a,int first,int last,int[] temp){ if(first<last){ int middle = (first+last)/2; merge_sort(a,first,middle,temp); merge_sort(a,middle+1,last,temp); mergeArray(a,first,middle,last,temp); } } //归并算法实现 public static void mergeArray(int[] a,int first,int middle,int end,int[] temp){ int i = first; int m = middle; int j = middle + 1; int n = end; int k = 0; while (i<=m && j<=n){ if(a[i]<=a[j]){ temp[k] = a[i]; i++; }else{ temp[k] = a[j]; j++; } k++; } while (i<=m){ temp[k] = a[i]; k++; i++; } while (j<=n){ temp[k] = a[j]; k++; j++; } for (int ii=0;ii<k;ii++){ a[first+ii] = temp[ii]; } }
//构造最小堆 public static void makeMinHeap(int[] a,int n){ for (int i=(n-1)/2;i>=0;i--){ //从最后一个叶子节点的父亲开始构建 minHeapFixDown(a,i,n); } } //最小堆调整 public static void minHeapFixDown(int[] a,int i,int n){ int j=2*i+1; int temp = 0; while (j<n){ if(j+1<n && a[j+1]<a[j]){ j++; } //父节点比最小子节点还小 if(a[i] <= a[j]){ break; } //较大节点下移 temp = a[i]; a[i] = a[j]; a[j] = temp; //继续向下进行最小堆调整 i = j; j = 2*i+1; } } //最小堆排序(降序) public static void minHeap_sort(int[] a,int n){ int temp = 0; makeMinHeap(a,n); for(int i=n-1;i>0;i--){ //将根节点(最小节点)与最后一个叶子节点交换,重新进行堆排序 temp = a[0]; a[0] = a[i]; a[i] = temp; minHeapFixDown(a,0,i); } }
//基数排序 /** * * @param a 原数组 * @param temp 临时数组 * @param n 序列的数字个数 * @param k 最大的位数2 * @param r 基数10 * @param cnt 存储bin[i]的个数 */ public static void radix_sort(int[] a,int[] temp,int n,int k,int r,int[] cnt){ //i:根据位数进行第几轮排序、rtok:根据个位/十位进行排序 for(int i=0,rtok=1;i<k;i++,rtok = rtok*r){ //初始化 for (int j=0;j<r;j++){ cnt[j] = 0; } //计算每个箱子的数字个数 for (int j=0;j<n;j++){ cnt[(a[j]/rtok%r)]++; } //cnt[j]的个数修改为前j个箱子一共有几个数字 for (int j=1;j<n;j++){ cnt[j] += cnt[j-1]; } //核心过程,按照个位/十位排序 for (int j=n-1;j>=0;j--){ //从后往前遍历原数组才能保证数据位于当前桶最后一个即可以确定最终位置 cnt[(a[j]/rtok)%r]--; temp[cnt[(a[j]/rtok)%r]] = a[j]; } for (int j=0;j<n;j++){ a[j] = temp[j]; } } }
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。