• 面试经典算法:快速排序Golang实现


    Golang快速排序

    定义

    快速排序由C. A. R. Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。

    基本思想

    通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    步骤

    1. 先从数列中取出一个数作为基准数。
    2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
    3. 再对左右区间重复第二步,直到各区间只有一个数。
    package main
    
    import "fmt"
    
    /************************************
     *函数名:quicksort
     *作用:快速排序算法
     *参数:
     *返回值:无
     *模拟:
    	begin:[]int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
    	-->[],12,[25 16 34 23 49 95 17 61]
    	---->[23 16 17],25,[95 49 61 85]
    	------>[17 16],23,[]
    	-------->[16],17,[]
    	---------->[],16,[]
    	------>[34 49 61 85],95,[]
    	-------->[],34,[61 85 95]
    	---------->[49],61,[95]
    	------------>[],49,[]
    	------------>[85],95,[]
    	-------------->[],85,[]
    	last:[]int{12, 16, 17, 23, 25, 34, 49, 61, 85, 95}
     ************************************/
     
    func quicksort(array []int, begin, end int, mark string) {
    	var i, j int
    	if begin < end {
    		i = begin + 1 // 将array[begin]作为基准数,因此从array[begin+1]开始与基准数比较!
    		j = end       // array[end]是数组的最后一位
    
    		for {
    			if i >= j {
    				break
    			}
    			if array[i] > array[begin] {
    				array[i], array[j] = array[j], array[i]
    				j = j - 1
    			} else {
    				i = i + 1
    			}
    
    		}
    
    		/* 跳出while循环后,i = j。
    		 * 此时数组被分割成两个部分  -->  array[begin+1] ~ array[i-1] < array[begin]
    		 *                           -->  array[i+1] ~ array[end] > array[begin]
    		 * 这个时候将数组array分成两个部分,再将array[i]与array[begin]进行比较,决定array[i]的位置。
    		 * 最后将array[i]与array[begin]交换,进行两个分割部分的排序!以此类推,直到最后i = j不满足条件就退出!
    		 */
    		if array[i] >= array[begin] { // 这里必须要取等“>=”,否则数组元素由相同的值时,会出现错误!
    			i = i - 1
    		}
    
    		array[begin], array[i] = array[i], array[begin]
    		fmt.Printf("%s>%v,%d,%v
    ", mark, array[begin:i], array[i], array[j:end])
    		quicksort(array, begin, i, mark+"--")
    		quicksort(array, j, end, mark+"--")
    	}
    }
    
    func main() {
    
    	nums := []int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
    	fmt.Printf("begin:%#v
    ", nums)
    
    	// 缩进
    	mark := "--"
    	quicksort(nums, 0, len(nums)-1, mark)
    	fmt.Printf("last:%#v
    ", nums)
    }
    

    转载请注明:http://www.lenggirl.com/algorithm/quicksort.html

  • 相关阅读:
    智能指针shared_ptr新特性shared_from_this及weak_ptr
    reactor模型框架图和流程图 libevent
    memset struct含有string的崩溃
    对于socket发送数据时是否要加锁及write read的阻塞非阻塞
    记录智能指针使用shared_ptr使用错误
    本地缓存和redis
    关于数据结构跳表的一些介绍
    linux 下source、sh、bash、./执行脚本的区别
    socket端口复用问题一二
    MD5算法
  • 原文地址:https://www.cnblogs.com/nima/p/11750903.html
Copyright © 2020-2023  润新知