一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - Go語言展現快速排序算法全過程的思路及代碼示例

Go語言展現快速排序算法全過程的思路及代碼示例

2020-04-29 11:06荊榆 Golang

這篇文章主要介紹了Go語言展現快速排序算法全過程的思路及代碼示例,文章最后作者還提到了對Quick Sort算法優化的一些想法,需要的朋友可以參考下

快速排序算法
快速排序是一個遞歸的思想,首先選擇一個數作為基數,把數組中小于它的數放在它的左邊,把大于它的數放在它的右邊,然后對左右兩邊的數遞歸進行排序。

算法的關鍵部分是實現數組的劃分,即怎么把數組的元素劃分成兩部分,使得左邊的數比基數小,右邊的數比基數大。劃分有許多不同的實現方法,這里主要使用單向掃描的方法,后面再稍微介紹雙向掃描的方法。

選擇最右邊的數字作為基數。使用一個變量j記錄當前左邊數字(比基數小的數)的最右的下標值。然后使用變量i從左到右遍歷數組,如果a[i]比基數小,說明a[i]屬于左邊的數,就把j自增,然后交換a[j]和當前的a[i]。因為自增前的j是左邊數字最右的下標,自增后的a[j]肯定不屬于左邊了,把其跟a[i]交換后,新的a[j]是屬于左邊的,而且此時j也重新變為左邊數字最右的下標了。

掃描結束后,把j自增(因為a[j]將會被交換到最右邊,因此要選屬于右邊的數字)后與最右邊的基數交換,此時的j即為劃分的結果。

Golang版的實現例子:

 

復制代碼 代碼如下:

 

package main
import "fmt"
 
type ElemType int;
 
func main() {
    data := make([]ElemType, 600000) // ALL ZERO
    var i int = 0;
    var dlen int = len(data);
    for i = 0 ; i < dlen ; i++{
        data[i] = (ElemType)(dlen - i -1);
    }
    fmt.Println("Start ...",len(data));
    for i = 0 ; i < 100 ; i++{
        fmt.Printf("%d ", data[i]);
    }
    fmt.Println();
    QuickSort(data,0,dlen-1);
    
    fmt.Println("End ...");
    for i = 0 ; i < 100 ; i++{
        fmt.Printf("%d ", data[i]);
    }
    fmt.Println();
}
 
func QuickSort(A []ElemType,low, high int){
    if low < high {
        // Partition() is the operation of divide A[low ... high]
        // one to two arrays which can be used as QuickSort Again
        pivotpos := Partition(A,low,high);
        QuickSort(A,low,pivotpos-1);
        QuickSort(A,pivotpos+1,high);
    }
}
 
func Partition(A []ElemType,low ,high int)  int {
    var pivot ElemType = A[low];
    var tmp ElemType;
    //Method I:
    //for low < high {
    //  for low < high && A[high] >= pivot { high-- ; }
    //  A[low] = A[high];
    //  for low < high && A[low] < pivot { low++; }
    //  A[high] = A[low];
    //}
    //end of MI
    
    //Method II:
    for (low < high) && (A[high] > pivot) { high --; }
    for (low < high) && (A[low] < pivot) {low++; }
    for low < high {
        // swap A[low] & A[high]
        tmp = A[low];
        A[low] = A[high];
        A[high] = tmp;
        low ++;
        high --;
    }
    //end of MII
 
    A[low] = pivot ;
    return low ;
}

 


執行輸出如下:

 

?
1
2
[yu@argcandargv-com quicksort]$ go build quicksort.go
[yu@argcandargv-com quicksort]$ ls

 

?
1
quicksort quicksort.go
?
1
[yu@argcandargv-com quicksort]$ time ./quicksort
?
1
2
3
4
Start ... 600000
599999 599998 599997 599996 599995 599994 599993 599992 599991 599990 599989 599988 599987 599986 599985 599984 599983 599982 599981 599980 599979 599978 599977 599976 599975 599974 599973 599972 599971 599970 599969 599968 599967 599966 599965 599964 599963 599962 599961 599960 599959 599958 599957 599956 599955 599954 599953 599952 599951 599950 599949 599948 599947 599946 599945 599944 599943 599942 599941 599940 599939 599938 599937 599936 599935 599934 599933 599932 599931 599930 599929 599928 599927 599926 599925 599924 599923 599922 599921 599920 599919 599918 599917 599916 599915 599914 599913 599912 599911 599910 599909 599908 599907 599906 599905 599904 599903 599902 599901 599900
End ...
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

 

?
1
2
3
real  1m55.564s
user  1m55.215s
sys 0m0.052s

PS:其實應用中有一個優化,因為快速排序在數組本來有序的情況下復雜度會退化為O(n^2)。為了避免這點,在選取基數的時候可以隨機地進行選擇。具體做法是把最右邊的數字跟一個隨機的數字交換位置。另外還有一種三數取中的方法,即選擇首尾跟中間某個數共三個數的中值作為基數。

 

延伸 · 閱讀

精彩推薦
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
主站蜘蛛池模板: 日韩毛片在线影视 | 清纯唯美 亚洲 | www.四虎.com| 猫咪社区在线播放 | 高h细节肉爽文办公室 | 久久热国产在线视频 | 人人九九精 | 亚洲七七久久综合桃花 | 日本一区二区三区久久 | 欧美性色黄大片四虎影视 | 国产卡一卡二卡3卡乱码免费 | 午夜福利理论片高清在线 | 国产一区日韩二区欧美三区 | 国产性色视频 | 男人女人日皮 | 91色香sxmv最网页版新地址 | 欧美靠逼 | 97色吧| 久久青青草原 | 武侠古典久久亚洲精品 | 欧美视频一二三区 | 免费国产午夜高清在线视频 | 双性受合不垅腿攻np | 91tm视频| 网站视频免费 | 午夜精品区 | 2018久久精品热在线观看 | 精品videoss另类日本 | voyeur 中国女厕 亚洲女厕 | 国产玖玖在线观看 | 884hutv四虎永久7777 | 国产日韩精品一区二区在线观看 | 色屁屁www | 国产成人免费观看在线视频 | 国产精品成| 第一次破苞h | 男男羞羞视频网站国产 | 日韩小视频在线观看 | 亚洲精品国产专区91在线 | 日本不卡免免费观看 | 日韩免费在线视频 |