十大经典排序算法最强总结(含Java、Python码实现) (2)

JAVA

/** * 冒泡排序 * @param arr * @return arr */ public static int[] BubbleSort(int[] arr) { for (int i = 1; i < arr.length; i++) { // Set a flag, if true, that means the loop has not been swapped, // that is, the sequence has been ordered, the sorting has been completed. boolean flag = true; for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; // Change flag flag = false; } } if (flag) { break; } } return arr; }

Python

def BubbleSort(arr): for i in range(len(arr)): is_sorted = True for j in range(len(arr)-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] is_sorted = False if is_sorted: break return arr

此处对代码做了一个小优化,加入了is_sorted Flag,目的是将算法的最佳时间复杂度优化为O(n),即当原输入序列就是排序好的情况下,该算法的时间复杂度就是O(n)。

择排序(Selection Sort)

选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n²)的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第2步,直到所有元素均排序完毕。

图解算法

Selection Sort

代码实现

JAVA

/** * 选择排序 * @param arr * @return arr */ public static int[] SelectionSort(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[j] < arr[minIndex]) { minIndex = j; } } if (minIndex != i) { int tmp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = tmp; } } return arr; }

Python

def SelectionSort(arr): for i in range(len(arr)-1): # 记录最小值的索引 minIndex = i for j in range(i+1, len(arr)): if arr[j] < arr[minIndex]: minIndex = j if minIndex != i: arr[i], arr[minIndex] = arr[minIndex], arr[i] return arr 插入排序(Insertion Sort)

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

算法步骤

从第一个元素开始,该元素可以认为已经被排序;

取出下一个元素,在已经排序的元素序列中从后向前扫描;

如果该元素(已排序)大于新元素,将该元素移到下一位置;

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

将新元素插入到该位置后;

重复步骤2~5。

图解算法

insertion_sort

代码实现

JAVA

/** * 插入排序 * @param arr * @return arr */ public static int[] InsertionSort(int[] arr) { for (int i = 1; i < arr.length; i++) { int preIndex = i - 1; int current = arr[i]; while (preIndex >= 0 && current < arr[preIndex]) { arr[preIndex + 1] = arr[preIndex]; preIndex -= 1; } arr[preIndex + 1] = current; } return arr; }

Python

def InsertionSort(arr): for i in range(1, len(arr)): preIndex = i-1 current = arr[i] while preIndex >= 0 and current < arr[preIndex]: arr[preIndex+1] = arr[preIndex] preIndex -= 1 arr[preIndex+1] = current return arr 希尔排序(Shell Sort)

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为递减增量排序算法,同时该算法是冲破O(n²)的第一批算法之一。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgpyd.html