一些常见的排序算法
Posted ccli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些常见的排序算法相关的知识,希望对你有一定的参考价值。
- 博主做的是关于Unity游戏方面的,虽然平时都没有用过这些排序算法,但还是很有必要学习一下。今天想温故一下,总结一下才能更好的进行下一步的学习。
一、冒泡排序
冒泡排序是一个特别简单的排序算法,代码也很容易实现。我总结起来就是:遍历数组n(数组的长度)次:每次与它下一个元素比较,如果这个元素比它下一个元素小,就交换这两个元素。可以发现,如果遍历一次数组的话可以得到数组的最大值或最小值。
一次遍历数组的结果:
经过多次遍历后:
源码:
import java.util.Arrays; public class BubbleSort { /** * 遍历数组,每次与它下一个元素比较,如果这个元素比它下一个元素小,就交换这两个元素. * @param arr */ void sort(int[] arr) { for(int j = 0; j < arr.length - 1; j ++) { for(int i = 0; i < arr.length - 1; i++) { if(arr[i] < arr[i + 1] ) { swap(arr, i, i + 1); } } } } /** * 交换数组的元素 * @param arr * @param a * @param b */ void swap(int[] arr, int a, int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } public static void main(String[] args) { int[] array = {4, 1, 7, 23, 0}; BubbleSort bSort = new BubbleSort(); bSort.sort(array); System.out.println(Arrays.toString(array)); } }
虽然排序正常了,但是不够好。因为在已经排序好的元素不需要再重新遍历了,所以我针对sort()方法优化一下:
void sort(int[] arr) { for(int j = 0; j < arr.length - 1; j ++) { //已经排序好的就不用再去遍历了 for(int i = 0; i < arr.length - j - 1; i++) { if(arr[i] < arr[i + 1] ) { swap(arr, i, i + 1); } } } }
二、选择排序
选择排序将一个数组分为两个部分,一部分是已经排序的序列,另一部分是未排序的序列。而排序都是将未排序的序列中找到一个最小的元素放到已排序的开头。我感觉还是用图来说明会更容易理解。
每次遍历未排序的序列都会从其中找到一个最小的元素,然后归入已排序的序列中
源码:
import java.util.Arrays; public class SelectionSort { /** * 从arr数组下标为min的元素开始向后依次比较:若有元素比arr[min]小,交换这两个值 * @param arr * @param min 作为比较较小值的索引下标 */ void sort(int[] arr, int min) { for(int i = min + 1; i < arr.length; i++) { if(arr[min] > arr[i] ) { swap(arr, min, i); } } } void swap(int[] arr, int a, int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } public static void main(String[] args) { int arr[] = { 6, 10, 7, 3, 9, 1, 5 }; SelectionSort cs = new SelectionSort(); for(int i = 0; i < arr.length; i++) { cs.sort(arr, i); } System.out.println(Arrays.toString(arr)); } }
本想一次性将剩下两个排序算法一起写完,发现将那两个算法写成博客比较麻烦,下次来完成
以上是关于一些常见的排序算法的主要内容,如果未能解决你的问题,请参考以下文章