本文总结了频繁出现在面试题中的排序算法,并提供了java和python两种语言实现,作为自己复习的总结,也希望对其他找工作的朋友们有所帮助。
一、快速排序:
快速排序通常情况下,是用于排序的最佳的实用选择。这是因为其平均性能相当好:期望的运行时间为O(nlogn),且O(nlogn)记号中隐藏的常数因子很小。另外,它还能够进行就地排序,在虚存环境中也能很好地工作。接下来我们便来好好了解一下快速排序的思想。
1、时间复杂度: best: O(n*logn) average: O(n*logn) worst: O(n^2)
2、空间复杂度: O(logn)
3、算法描述:
像合并排序一样,快速排序也是基于分支模式的,主要分为以下三个步骤:分解、解决、合并
4、快速排序的数据结构:
QUICKSORT(A, p, r)
if p<r
then q <- PARTITION(A, p, r)
QUICKSORT(A, p, q-1)
QUICKSORT(A, q+1, r)
为排序一个完整的数组A,最初的调用是QUICKSORT(A, 1, length(A))
快速排序算法的关键是PARTITION过程,它对子数组A[p...r]进行就地重排:
PARTITION(A,p, r)
x <- A[r]
i <- p-1
for j <- p to r-1
do if A[j]<=x
then i <- i+1
exchange A[i] <-> A[j]
exchange A[i+1] <-> A[r]
return i+1
5、python实现快速排序代码:
'''
quick_sort
author: fuhongyu
time: 2018-07-27
time complecity: O(nlog(n))
object:15 minutes
'''
def quick_sort(array, l, r):
if l < r:
q = partition(array, l, r)
quick_sort(array, l, q - 1)
quick_sort(array, q + 1, r)
return array
def partition(array, l, r):
x = array[r]
i = l - 1
for j in range(l, r):
if array[j] <= x:
i += 1
array[i], array[j] = array[j], array[i]
array[i + 1], array[r] = array[r], array[i+1]
return i + 1
测试快速排序代码:
lists = [3,5,1,2,7]
quick_sort(lists, 0, len(lists)-1)
6、java实现快速排序:
package test;
/**
*
* @author FHY
* 实现快速排序
* 2019.6.6
*/
public class QuickSortDemo {
public static void main(String[] args) {
int[] nums = {2,4,1,6,3,8,5};
int n = nums.length;
quickSort(nums, 0, n-1);
for (int i : nums) {
System.out.println(i);
}
}
private static void quickSort(int[] nums, int p, int n) {
if (p>=n) return;
int q = getPartition(nums,p, n);//获取分区
quickSort(nums, p, q-1);
quickSort(nums, q+1, n);
}
/**
* @param nums 数组
* @param p 要比较