重新回顾九大排序算法

最近无聊想回顾一下大一学过的排序算法。目前才写了一点。。。心得以后再补充吧!!

1.插入排序

//插入排序
 /*
  * 把数组a的第n个数插入前n-1个数中,注意前n-1个数已经是排好序的了
  * */

public static void insertSort(int[] arr){
  int len = arr.length;
  int key;
  int i,j;
  for(i = 1; i < len; i++){
   j = i;
   key = arr[i];
   
   while(j > 0 && key < arr[j-1]){
    arr[j] = arr[j - 1];
    j--;
   }
   arr[j] = key;
  }
 }

//插入排序[递归]
 /*
  * 递归插入,跟求阶乘的思想一样,前n-1个排好序的数组,是建立在前n-2个排好序的数组的基础上插出来的
  * */

public static void insertSortRecursively(int[] arr, int index){
  int len = arr.length;
  int i;
  if(index >= len){
   return;
  }
  int key = arr[index];
  for(i = index -1; i >= 0 && key < arr[i]; i--){
   arr[i + 1] = arr[i];
  }
  arr[i + 1] = key;
  insertSortRecursively(arr, index+1);
 }

2.冒泡排序

//冒泡排序
 /*
  * 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,
  * */
 public static void bubbleSort(int[] arr){
  int len = arr.length;
  int i, j;
//  int item;
  for(i = len; i > 0; i--){
   for(j = 0; j< i-1; j++){
    if(arr[j] > arr[j + 1]){
//     item = arr[j + 1];
//     arr[j + 1] =arr[j];
//     arr[j] = item;
     /*
      * 位运算法交换
      * */
     arr[j] = arr[j + 1] ^ arr[j];
     arr[j+1] = arr[j + 1] ^ arr[j];
     arr[j] = arr[j + 1] ^ arr[j];
    }
   }
  }
 }

3.选择排序

//选择排序
 /*
  * 从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。
  * */
 public static void selectSort(int[] arr){
  int len = arr.length;
  int i, j;
  int min;
  for(i = 0;i < len; i++){
   min = arr[i];
   for(j = i + 1; j < len; j++){
    if(min > arr[j]){
     min = arr[j] ^ min;
     arr[j] = arr[j] ^ min;
     min = arr[j] ^ min;
    }
   }
   arr[i] = min;
  }
 }

4。归并排序

 //归并排序
 /*
  * 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。
  * 然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可
  * 
  * */
  
//  public void Merge(int[] array, int low, int mid, int high) {
//
//         int i = low; // i是第一段序列的下标
//
//         int j = mid + 1; // j是第二段序列的下标
//
//         int k = 0; // k是临时存放合并序列的下标
//
//         int[] array2 = new int[high - low + 1]; // array2是临时合并序列
//
//
//
//         // 扫描第一段和第二段序列,直到有一个扫描结束
//
//         while (i <= mid && j <= high) {
//
//             // 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描
//
//             if (array[i] <= array[j]) {
//
//                 array2[k] = array[i];
//
//                 i++;
//
//                 k++;
//
//             } else {
//
//                 array2[k] = array[j];
//
//                 j++;
//
//                 k++;
//
//             }
//
//         }
//
//
//
//         // 若第一段序列还没扫描完,将其全部复制到合并序列
//
//         while (i <= mid) {
//
//             array2[k] = array[i];
//
//             i++;
//
//             k++;
//
//         }
//
//
//
//         // 若第二段序列还没扫描完,将其全部复制到合并序列
//
//         while (j <= high) {
//
//             array2[k] = array[j];
//
//             j++;
//
//             k++;
//
//         }
//
//
//
//         // 将合并序列复制到原始序列中
//
//         for (k = 0, i = low; i <= high; i++, k++) {
//
//             array[i] = array2[k];
//
//         }
//
//     }
//
//
//
//     public void MergePass(int[] array, int gap, int length) {
//
//         int i = 0;
//
//         
//
//         // 归并gap长度的两个相邻子表
//
//         for (i = 0; i + 2 * gap - 1 < length; i = i + 2 * gap) {
//
//             Merge(array, i, i + gap - 1, i + 2 * gap - 1);
//
//         }
//
//         
//
//         // 余下两个子表,后者长度小于gap
//
//         if (i + gap - 1 < length) {
//
//             Merge(array, i, i + gap - 1, length - 1);
//
//         }
//
//     }
//
//
//
//     public int[] sort(int[] list) {
//
//         for (int gap = 1; gap < list.length; gap = 2 * gap) {
//
//             MergePass(list, gap, list.length);
//
//             System.out.print("gap = " + gap + ":\t");
//
//             this.printAll(list);
//
//         }
//
//         return list;
//
//     }
//
//
//
//     // 打印完整序列
//
//     public void printAll(int[] list) {
//
//         for (int value : list) {
//
//             System.out.print(value + "\t");
//
//         }
//
//         System.out.println();
//
//     }
//
//
//
//     public static void main(String[] args) {
//
//         int[] array = { 9, 1, 5, 3, 4, 2, 6, 8, 7};
//
//         Algorithm merge = new Algorithm();
//
//         System.out.print("排序前:\t\t");
//
//         merge.printAll(array);
//
//         merge.sort(array);
//
//         System.out.print("排序后:\t\t");
//
//         merge.printAll(array);
//
//     }

 
  /**
   * 归并排序
   * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
   * 时间复杂度为O(nlogn)
   * 稳定排序方式
   * @param nums 待排序数组
   * @return 输出有序数组
   */
  public static void mergeSort(int[] nums, int low, int high) {
   int mid = (low + high) / 2;
   
   if (low < high) {
    // 左边
    mergeSort(nums, low, mid);
    // 右边
    mergeSort(nums, mid + 1, high);
    // 左右归并
    merge(nums, low, mid, high);
   }
  }

  
  public static void merge(int[] nums, int low, int mid, int high) {
   int[] temp = new int[high - low + 1];
   int i = low;// 左指针
   int j = mid + 1;// 右指针
   int k = 0;

   // 把较小的数先移到新数组中
   while (i <= mid && j <= high) {
    if (nums[i] < nums[j]) {
     temp[k++] = nums[i++];
    } else {
     temp[k++] = nums[j++];
    }
   }

   // 把左边剩余的数移入数组
   while (i <= mid) {
    temp[k++] = nums[i++];
   }

   // 把右边边剩余的数移入数组
   while (j <= high) {
    temp[k++] = nums[j++];
   }

   // 把新数组中的数覆盖nums数组
   for (int k2 = 0; k2 < temp.length; k2++) {
    nums[k2 + low] = temp[k2];
   }
  }

5.快速排序

/***
   * 快速排序
   * 1.先从数列中取出一个数作为基准数。
   * 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
   * 3.再对左右区间重复第二步,直到各区间只有一个数。
   */
  /**
   * @param arr 数组
   * @param left 左边
   * @param right 右边
   */
  public static void quickSort(int[] arr,int left,int right){
   if(left < right){
    int pivo = arr[left];
    int low = left;
    int high = right;
    while(low < high){
     while(arr[high] > pivo && low < high){
      high--;
     }
     arr[low] = arr[high];
     while(arr[low] < pivo && low < high){
      low++;
     }
     arr[high] = arr[low];
    }
    arr[low] = pivo;
    quickSort(arr, left, low-1);
    quickSort(arr, low+1, right);
   }
  }
时间: 2024-10-16 01:00:28

重新回顾九大排序算法的相关文章

九大排序算法总结

九大排序算法再总结 算法的由来:9世纪波斯数学家提出的:“al-Khowarizmi” 排序的定义: 输入:n个数:a1,a2,a3,...,an 输出:n个数的排列:a1',a2',a3',...,an',使得a1'<=a2'<=a3'<=...<=an'. In-place sort(不占用额外内存或占用常数的内存):插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 当需要对大量数据进行排序时,In-plac

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序

  闲着的时候看到一篇“九大排序算法在总结”,瞬间觉得之前数据结构其实都有学过,但当初大多数都只是老师随口带过,并没有仔细研究一下.遂觉:这是欠下的账,现在该还了.   排序按照空间分类: In-place sort不占用额外内存或占用常数的内存 插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 或者按照稳定性分类: stable sort:插入排序.冒泡排序.归并排序.计数排序.基数排序.桶排序. unstable sort

九大排序算法,你会几个?

概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已

Javascript九大排序算法详解

排序很多时候都会用到,而在js中排序的算法有九个是人们常用的,而且使用起来可以很流畅.本文将对这九种排序算法进行详细介绍,教程尚硅谷JavaScript DOM视频教程还有详细的代码分享哦. 一.插入排序 1)算法简介 插 入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到 O(1)的额外空间的排序),因而在从后向前扫

九大排序算法再总结

本文是 http://blog.csdn.net/xiazdong/article/details/7304239 的补充,当年看了<大话数据结构>总结的,但是现在看了<算法导论>,发现以前对排序的理解还不深入,所以打算对各个排序的思想再整理一遍. 本文首先介绍了基于比较模型的排序算法,即最坏复杂度都在Ω(nlgn)的排序算法,接着介绍了一些线性时间排序算法,这些排序算法虽然都在线性时间,但是都是在对输入数组有一定的约束的前提下才行. 这篇文章参看了<算法导论>第2.3

【转】九大排序算法

如果要转载,需要注明出处: http://blog.csdn.net/xiazdong 本文是 http://blog.csdn.net/xiazdong/article/details/7304239 的补充,当年看了<大话数据结构>总结的,但是现在看了<算法导论>,发现以前对排序的理解还不深入,所以打算对各个排序的思想再整理一遍. 本文首先介绍了基于比较模型的排序算法,即最坏复杂度都在Ω(nlgn)的排序算法,接着介绍了一些线性时间排序算法,这些排序算法虽然都在线性时间,但是都

【Java】九大排序算法总结(复杂度及应用场景)

1.冒泡排序,不管序列是怎样,都是要比较n(n-1)/2 次的,最好.最坏.平均时间复杂度都为O(n²),需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1). 优化:使用一个标志位来判断是否有序,若果有序,那么循环一次就直接退出,时间复杂度为O(n). 2.选择排序是冒泡排序的改进,同样选择排序无论序列是怎样的都是要比较n(n-1)/2次的,最好.最坏.平均时间复杂度也都为O(n²),需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1). 3.插入排序,如果序列是完全有

九大排序算法Demo

1. 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 1 int[] array = {5, 4, 3, 2, 1}; 2 3 boolean isChanged = false; 4 for (int i = 0; i < array.length; i