排序算法总结

会有一股神秘感。 提交于 2019-11-29 16:03:14

排序算法总结

整理自java知音

排序算法说明

排序的定义

对一序列对象根据关键字排序;

术语说明

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;

不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;

内排序:所有排序操作都在内存中完成;

外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;

时间复杂度:一个算法执行所耗费的时间。

空间复杂度:运行完一个程序所需内存的大小。

算法总结

图片名词解释:

n: 数据规模

k: “桶”的个数

In-place: 占用常数内存,不占用额外内存

Out-place: 占用额外内存

冒泡排序

算法描述

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 重复步骤1~3,直到排序完成;

(注:每一次比较的结果是最大值)

动图演示

代码演示

/* 冒泡排序*/ public static int[] bubbleSort(int[] array) {     if(array.length == 0 || array.length == 1) {         return array;     }     /* 一个长度为N的数组需要冒泡N-1次*/     for (int i = 0; i< array.length - 1 ;i++){         /* 相邻元素比较的次数为总元素N-开始的第一个元素-已经排序的最大元素个数 i*/         for(int j = 0; j < array.length -1 - i;j++) {             if (array[j] > array[j+1]) {                 int temp = array[j+1];                 array[j+1] = array[j];                 array[j] = temp;             }         }     }     return array; }

选择排序

算法描述

  1. 从数组第一个元素开始,假设第一个元素(n = 1)是最小值;
  2. 让array[n-1] 与后面的元素依次比较,若碰到array[n-1]>array[i]则交换元素,最后第一个元素就为最小值;
  3. 第n个元素都重复步骤2,直到排序完成;

(注:每次比较的结果是最小值)

动图演示

代码演示

/* 选择排序*/ public static int[] selectSort(int[] array) {     if(array.length == 0 || array.length == 1) {         return array;     }     for (int i = 0; i < array.length; i++) {         int minIndex = i;         for (int j = i + 1; j < array.length;j++)             if (array[j] < array[minIndex]) {                 /* 始终保持minIndex 指向最小的值*/                 minIndex = j;             }         int temp = array[minIndex];         array[minIndex] = array[i];         array[i] = temp;     }     return array; }

插入排序

算法描述

  1. 数组第N个元素(n从2开始),依次向前面的元素比较
  2. 如果前面的元素大于元素n,则将该元素插到元素n的后面;
  3. 重复以上步骤,纸质排序完成;

动图演示

代码演示

/* 插入排序*/ public static int[] insertSort(int[] array) {     if(array.length == 0 || array.length == 1) {         return array;     }      /* 默认第一个元素已被排序,从第二个元素开始*/     for (int i = 1; i < array.length;i++)         /* 依次向前比较,如小于前面的元素,则置换位置*/         for (int j = i - 1; j > = 0 ; j--) {             if (array[j] > array[i]) {                 int temp = array[i];                 array[i] = array[j];                 array[j] = temp;             }         }     return array; }

快速排序

算法描述

从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

动图演示

代码演示

/** * 快速排序 * @param array * @param start * @param end * @return */ public static int[] QuickSort(int[] array, int start, int end) {     /* 随机设置一个基准值 ,此处选中值*/     int pivot = array[(start + end) /2];     /* 设置左右游标*/     int left = start;     int right = end;      while (left < right) {         /* 左游标向右找,直到找到大于基准值的元素*/         while (array[left] < pivot) {             left++;         }         /* 右游标向找找,直到找到小于基准值的元素*/         while (array[right] > pivot) {             right--;         }         /* 结束条件*/         if(left >= right){             break;         }          /* 一旦找到左边大于基准值, 或右边小于基准值的元素就交换*/         int temp = array[left];         array[left] = array[right];         array[right] = temp;          /* 交换后,左边的值等于基准值,则右游标前移一位,进行下一轮交换*/         if(array[left] == pivot) {             right--;         }         /* 交换后,右边的值等于基准值,则左游标前移一位,进行下一轮交换*/         if (array[right] == pivot) {             left++;         }     }      /* 防止栈溢出*/     if (left == right) {         left++;         right--;     }     /* 向左递归*/     if(start < right){         QuickSort(array, start, right);     }     /* 向右递归*/     if(left < end){         QuickSort(array, left, end);     }      return array; }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!