各种排序算法
从第二个元素开始,和前面的元素比较,如果后面的小于前面的,就交换两个元素位置
public static void sort11(int[] a) {
for (int i = 1; i < a.length; i++) {
while (a[j] < a[j - 1] && j > 1) {
public static void erfenpaixu(int[] a) {
for (int i = 1; i < a.length; i++) {
for (int j = i - 1; j > high; j--) {
public static void MaoPai(int[] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length - i - 1; j++) {
插入排序和冒泡排序的区别: 插入排序越往后面,动静越大,因为涉及到的元素越来越多;冒泡排序越往后面,动静越小,因为涉及到的元素越来越少。
如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.
首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=tmp),就将high位置的值赋值给low位置 ,结果如下:
然后开始从前往后扫描,如果扫描到的值小于基准数据就让low加1,如果发现有元素大于基准数据的值(如上图46=>tmp),就再将low位置的值赋值给high位置的值,指针移动并且数据交换后的结果如下:
然后再开始从后向前扫描,原理同上,发现上图11<=tmp,则将low位置的值赋值给high位置的值,结果如下:
然后再开始从前往后遍历,直到low=high结束循环,此时low或high的下标就是基准数据23在该数组中的正确索引位置.如下图所示.
这样一遍走下来,可以很清楚的知道,其实快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边,这样就找到了该数据在数组中的正确位置.
以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。
public static void quickSort(int[] a, int low, int high) {
int index = getIndex(a, low, high);
quickSort(a, index + 1, high);
public static int getIndex(int[] a, int low, int high) {
while (high > low && a[high] >= temp) {
while (high > low && a[low] <= temp) {
1. 思想:每次从未排序的序列中选择一个最小的数未排序序列第一个数交换,相当于每次从未排序的序列中选择一个最小的数放到排好序的序列最后一个位子,当未排序序列为空的时候整个序列即为有序
第一次:序列 8 7 3 4 5 0 1,未排序序列最小的数0,和8交换,此时排好序序列为0
第二次:序列 0 7 3 4 5 8 1,未排序序列最小的数1,和7交换,此时排好序序列为0 1
第三次:序列 0 1 3 4 5 8 7,未排序序列最小的数3,本身不用交换,此时排好序序列为0 1 3
public static void chooseSort(int[] a) {
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
public static void guiBingSort(int[] a, int start, int end, int mid) {
int[] temp = new int[end - start + 1];
while (p1 <= mid && p2 <= end) {








浙公网安备 33010602011771号