快速排序

hrenlo · 2013-07-24 02:45:29 · 5022 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-07-24 02:45:29 的主题,其中的信息可能已经有所发展或是发生改变。

// QuickSort project main.go
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    var my_slice = make([]int, 0, 100)
    rand.Seed(int64(time.Now().Nanosecond()))
    for i := 0; i < 10; i++ {
        my_slice = append(my_slice, rand.Intn(1001))
    }

    fmt.Println("Before The Quick Sort:")
    fmt.Println(my_slice)
    fmt.Println("Sorting......")
    QuickSort(my_slice, 0, len(my_slice)-1)
    fmt.Println("OK! Finish!!!")
    fmt.Println("After The Quick Sort:")
    fmt.Println(my_slice)
}

func QuickSort(slice_arg []int, iLeft int, iRight int) {
    var iIndex = (iLeft + iRight) / 2
    var iTmpVal = slice_arg[iIndex]

    i, j := iLeft, iRight
    for i < j {
        fmt.Println("i,j = ", i, j)
        for i < iIndex && slice_arg[i] < slice_arg[iIndex] {
            i++
        }
        if i < iIndex {
            slice_arg[iIndex] = slice_arg[i]
            iIndex = i
        }
        for j > iIndex && slice_arg[j] > slice_arg[iIndex] {
            j--
        }
        if iIndex < j {
            slice_arg[iIndex] = slice_arg[j]
            iIndex = j
        }
    }

    slice_arg[iIndex] = iTmpVal

    if iIndex-iLeft > 1 {
        QuickSort(slice_arg, iLeft, iIndex-1)
    }
    if iRight-iIndex > 1 {
        QuickSort(slice_arg, iIndex+1, iRight)
    }
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5022 次点击  
加入收藏 微博
4 回复  |  直到 2013-07-26 09:41:47
hrenlo
hrenlo · #1 · 12年之前

自己跟踪了一下,i和j循环变量怎么不会变啊?

polaris
polaris · #2 · 12年之前

跟踪一下就知道为啥了。

另外,你的算法写的不对。

func QuickSort(slice_arg []int, iLeft int, iRight int) {
    if iLeft < iRight {
        var iTmpVal = slice_arg[iLeft]
        var i, j = iLeft, iRight
        for i < j {
            fmt.Println("i,j = ", i, j)
            for i < j && slice_arg[j] > iTmpVal {
                j--
            }
            if i < j {
                slice_arg[i] = slice_arg[j]
                i++
            }

            for i < j && slice_arg[i] < iTmpVal {
                i++
            }
            if i < j {
                slice_arg[j] = slice_arg[i] 
                j--
            }
        }
        slice_arg[i] = iTmpVal

        QuickSort(slice_arg, iLeft, i-1)
        QuickSort(slice_arg, j+1, iRight)
    }
}
hrenlo
hrenlo · #3 · 12年之前
polarispolaris #2 回复

跟踪一下就知道为啥了。 另外,你的算法写的不对。 func QuickSort(slice_arg []int, iLeft int, iRight int) { if iLeft < iRight { var iTmpVal = slice_arg[iLeft] var i, j = iLeft, iRight for i < j { fmt.Println("i,j = ", i, j) for i < j && slice_arg[j] > iTmpVal { j-- } if i < j { slice_arg[i] = slice_arg[j] i++ } for i < j && slice_arg[i] < iTmpVal { i++ } if i < j { slice_arg[j] = slice_arg[i] j-- } } slice_arg[i] = iTmpVal QuickSort(slice_arg, iLeft, i-1) QuickSort(slice_arg, j+1, iRight) } }

我感觉算法是一样的啊,只是你选的是最左边的值,我选的是中间的值啊?

Hubery
Hubery · #4 · 12年之前

快速排序可以用sort包

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传