zoukankan      html  css  js  c++  java
  • [算法初步]之快速排序

    [算法初步]之快速排序
    
    ##1 场景
    大家有没有见过苹果装箱呢,苹果长出来的时候总是大小不一的。这个时候就需要人工挑选出来,大的装一箱,小的装一箱。这样才能卖出合理的价钱。
    
    假如现在有一箱苹果,重量分别如下(好吧,外星球产的苹果,差别比较大。细节问题,不要关心~):
    
    * [3, 5, 1, 7, 6, 2, 11, 13, 4]
    
    我们决定分在个箱子里卖掉。当然要先把苹果按照制定的标准挑选出来,然后定一个统一价。
    
    小于这个标准和大于这个标准的装在另外2个箱子里。以不同的价格卖出。我们就以左边箱子装小苹果,右边的箱子装大苹果。
    
    下面就需要来挑拣了。
    
    首先怎么判定大小的标准呢,这个可是没有定数的。
    
    既然没有标准,我们默认只要你看到的第一个就是标准大小的,我们就按这个定价。然后和这个不一致的其他的苹果分在两边。
    
    第一个苹果是3,我们就把秤定到3kg。然后来称量苹果的重量然后装箱。
    
    * [小苹果箱][3, 5, 1, 7, 6, 2, 11, 13, 4][大苹果箱]		重量标记 3
    
    当然了,我们准备左右开工同时来挑拣苹果。小的放左边的小箱子,大的放右边的大箱子,而标准的那个尽量放中间了。
    
    右手边的一眼望去都是11kg, 13kg, 4kg的都是比较大的苹果,直接往箱子里面放,到2kg那个,哎小了,跟标准那个换换位置,然后就可以丢进小箱子里了。
    
    * 小苹果箱[][3, 5, 1, 7, 6, 2][11, 13, 4] 大苹果箱  (2和3交换)
    
    * 小苹果箱[2][ 5, 1, 7, 6, 3][11, 13, 4] 大苹果箱 
    
    这个时候左手操作跟上来了,咦5大了,跟标准那个位置换换吧,然后丢进大箱子里面吧。
    
    * 小苹果箱[2][ 5, 1, 7, 6, 3][11, 13, 4] 大苹果箱  (3和5交换)
    * 小苹果箱[2][ 3,1, 7, 6 ][5,11, 13, 4] 大苹果箱
    
    如此继续,右左右左的开工。知道比较完了所有的苹果。结果如下
    
    * 小苹果箱 [2, 1] 3 [ 7, 6, 5 11, 13, 4]
    
    ok了。标准的苹果我们已经挑出来了,左边的苹果都是比这个小的小苹果,而右边都是大苹果了。
    
    但是老板看了一眼,还是不满意。说我们为什么不分的再细一些呢。这样我们就可以按更合适的价格分别卖了。
    
    ok,标准的那个不用动了。那么就继续对小苹果箱和大苹果箱里面的苹果分别再详细分吧。过程和前面是一样的。
    
    这样一直到最后,当我们分的不能再分的时候。所有的大小箱的苹果也就划分好了。
    
    * 最终结果[1,2,3,4,5,6,7,8,9]
    
    
    ##2 go语言代码
    	package main
    	
    	import (
    		"fmt"
    	)
    	
    	func Partition(data *[9]int, low int, high int) int {
    	
    		criteria := data[low]
    		for low < high {
    			for low < high && data[high] >= criteria {
    				high--
    			}
    			data[low], data[high] = data[high], data[low]
    	
    			for low < high && data[low] <= criteria {
    				low++
    			}
    			data[low], data[high] = data[high], data[low]
    		}
    		return low
    	
    	}
    	
    	func QuickSort(data *[9]int, low int, high int) {
    		if low < high {
    			pos := Partition(data, low, high)
    			QuickSort(data, low, pos-1)
    			QuickSort(data, pos+1, high)
    		}
    	}
    	
    	func main() {
    		data := [9]int{3, 5, 1, 7, 6, 2, 8, 9, 4}
    		QuickSort(&data, 0, len(data)-1)
    		for i := 0; i < len(data); i++ {
    			fmt.Print(data[i], ",")
    	
    		}
    		fmt.Println()
    	}
    
    	
    
  • 相关阅读:
    加密CMD使电脑溢出也拿不到CMD权限
    全面提升Linux服务器的安全
    ping 源码,详细解释
    伤心一百回
    聊聊我对黑客技术的思考
    一个网管员的真实成长经历
    通过命令限制上网用户的权限
    防范黑客的简单办法
    “黑客”人生
    黑客现身讲话
  • 原文地址:https://www.cnblogs.com/sxt102400/p/3036430.html
Copyright © 2011-2022 走看看