Java数据结构与算法——篇三:排序算法

发布于:2022-10-13 ⋅ 阅读:(364) ⋅ 点赞:(0)

一、冒泡排序

1、排序原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2、源代码

public int[] bubbleSort(int[] arr) {
        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]) {
                    int temp = arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        return arr;
    }

二、选择排序

1、排序原理

  1. 每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引
  2. 交换第一个索引处和最小值所在的索引处的值

2、源代码

public int[] SectionSort(int[] arr) {
       for (int i = 0; i < arr.length - 1; i++) {
           int minIndex = i;//最小元素索引
           for (int j = i + 1; j < arr.length; j++) {
               if (arr[minIndex] > arr[j]) {//按照升序排列
                   minIndex = j;
               }
           }
           //交换位置
           int temp = arr[i];
           arr[i] = arr[minIndex];
           arr[minIndex] = temp;
       }
       return arr;
}

三、插入排序

1、排序原理

  1. 把所有的元素分为两组,已经排序的和未排序的;
  2. 找到未排序的组中的第一个元素,向已经排序的组中进行插入;
  3. 倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位;

2、源代码

public int[] insertSort(int[] arr) {
	for (int i = 1; i < arr.length; i++) {
		for (int j = i;j > 0;j++){
			if (arr[j] > arr[i]){
				int temp = arr[j];
				arr[j] = arr[i];
				arr[i] = temp;
			}else {
				break;
			}
		}
     }
	return arr;
}

四、希尔排序

1、排序思想

  1. 选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组;
  2. 对分好组的每一组数据完成 插入排序
  3. 减小增长量,最小减为1,重复第二步操作。

2、源代码

public int[] mergeSort(int[] arr) {
    int n = arr.length / 2;
    while (n >= 1) {
        //插入排序
        for (int i = n; i < arr.length; i++) {
            for (int j = i - n; j >= 0; j -= n) {
                if (arr[j] > arr[j + n]) {
                    int temp = arr[j];
                    arr[j] = arr[j + n];
                    arr[j + n] = temp;
                }
            }
        }
        n = n / 2;
     }
     return arr;
}

五、归并排序

1、排序思想

  1. 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针超出序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

2、源代码

public int[] mergeSort(int[] arr, int l, int h) {
    if (l == h)
        return new int[] { arr[l] };

    int mid = l + (h - l) / 2;
    int[] leftArr = mergeSort(arr, l, mid); //左有序数组
    int[] rightArr = mergeSort(arr, mid + 1, h); //右有序数组
    int[] newNum = new int[leftArr.length + rightArr.length]; //新有序数组
    
    int m = 0, i = 0, j = 0;
    while (i < leftArr.length && j < rightArr.length) {
        newNum[m++] = leftArr[i] <= rightArr[j] ? leftArr[i++] : rightArr[j++];
    }
    while (i < leftArr.length)
        newNum[m++] = leftArr[i++];
    while (j < rightArr.length)
        newNum[m++] = rightArr[j++];
    return newNum;
}

专栏:数据结构与算法

持续更新与改进中!!