排序算法主要有:插入排序,选择排序,冒泡排序,希尔排序,归并排序,快速排序,堆排序。这里的排序指的是内部排序,也就是基于内存的排序,基于内存的排序是基于大O模型的,可以使用大O模型来衡量算法的性能
摘自我自己的博客园:www.cnblogs.com/myadmin/p/5… 中的部分排序算法。
插入排序
基本思想:每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
原始:4 3 1 2
1) 3 4 1 2
2) 1 3 4 2
3) 1 2 3 4
核心代码:
/*** 插入排序*/public static int[] insertSort(int[] arr) {for (int i = 1; i
选择排序
基本思想:从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。
3 2 1 4 6 5初始化索引位置为0
寻找最小值所在位置交换:1 2 3 4 6 5初始化索引位置为1
寻找最小值所在位置交换:1 2 3 4 6 5依次类推!
核心代码:
/*** 选择排序*/public static int[] selectSort(int[] arr) {for (int i = 0; i
冒泡排序
基本思想:原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换。
核心代码:
/*** 冒泡排序* * @param arr* 输入的待排数组* @return 返回排序号的数组*/public static int[] bubbleSort(int[] arr) {for (int i = 0; i
希尔排序
基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 核心代码: 基本思想:将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。 核心代码: 基本思想:快速排序采用的思想是分治思想。 核心代码:/*** 希尔排序* * @author sgl* */
public class ShellSort {public static int[] shellSort(int[] arr) {int step &#61; arr.length / 2;// 初始步长while (1 <&#61; step) {for (int i &#61; step; i 归并排序
归并排序其实要做两件事&#xff1a;
&#xff08;1&#xff09;“分解”——将序列每次折半划分。
&#xff08;2&#xff09;“合并”——将划分后的序列段两两合并后排序。public static int[] sort(int[] nums, int low, int high) {int mid &#61; (low &#43; high) / 2;if (low
快速排序
快速排序是找出一个元素&#xff08;理论上可以随便找一个&#xff09;作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值&#xff0c;如此作为基准的元素调整到排序后的正确位置。递归快速排序&#xff0c;将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置&#xff0c;排序完成。所以快速排序算法的核心算法是分区操作&#xff0c;即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。/*** 快速排序* * &#64;author sgl* */
public class QuickSort {static void quicksort(int n[], int left, int right) {int dp;if (left