42.Go语言·数据结构·排序

2019-06-20  本文已影响0人  一枼落知天下

main.go

// Go语言·数据结构·排序
package main

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

var content string = `
————————————————Go语言·数据结构·排序————————————————————
一、排序
    1.冒泡排序  O(n²)   https://www.jianshu.com/p/eb74b2161f61
    2.选择排序  O(n^2)
        内部排序,从欲排序的数据中,按指定的规则选择一个最小的

    3.插入排序  O(n^2)
    4.快速排序  O(nlogn)
               减少咯比较,交换次数
        除以2 /2 递减

`

func main() {

    // var intArr [5]int = [...]int{24,69,80,57,33}
    // fmt.Println("排序前:",intArr)
    // QuickSort(&intArr)
    // fmt.Println("排序后:",intArr)

    var arr [8000000]int
    for i := 0; i < 8000000; i++ {
        arr[i] = rand.Intn(900000)
    }
    start := time.Now().Unix()
    //调用快速排序
    QuickSort(0, len(arr) - 1, &arr)
    end := time.Now().Unix()
    fmt.Println("main..")
    fmt.Printf("快速排序法耗时%d秒 \n", end - start)

}


//快速排序
//说明
//1. left 表示 数组左边的下标
//2. right 表示数组右边的下标
//3  array 表示要排序的数组
func QuickSort(left int, right int, array *[8000000]int) {
    l := left
    r := right
    // pivot 是中轴, 支点
    pivot := array[(left + right) / 2]
    temp := 0

    //for 循环的目标是将比 pivot 小的数放到 左边
    //  比 pivot 大的数放到 右边
    for ; l < r; {
        //从  pivot 的左边找到大于等于pivot的值
        for ; array[l] < pivot; {
            l++
        }
        //从  pivot 的右边边找到小于等于pivot的值
        for ; array[r] > pivot; {
            r--
        }
        // 1 >= r 表明本次分解任务完成, break
        if l >= r { 
            break
        }
        //交换
        temp = array[l]
        array[l] = array[r]
        array[r] = temp
        //优化
        if array[l]== pivot  {
            r--
        }
        if array[r]== pivot {
            l++         
        }
    }
    // 如果  1== r, 再移动下
    if l == r {
         l++
         r--
    }
    // 向左递归
    if left < r {
        QuickSort(left, r, array)
    }
    // 向右递归
    if right > l {
        QuickSort(l, right, array)
    }
}

/**
 * 插入排序
 *  var intArr [5]int = [...]int{24,69,80,57,33}
    fmt.Println("排序前:",intArr)
    insertSort(&intArr)
    fmt.Println("排序后:",intArr)
 */
func insertSort(intArr *[5]int) {
    // 完成一次交换,给第二个元素找到合适的位置并插入
    // // 第一次
    // insertVal := intArr[1]
    // insertIndex := 1-1

    // // 从大到小
    // for insertIndex>=0 && intArr[insertIndex] <insertVal {
    //  intArr[insertIndex+1] = intArr[insertIndex]
    //  insertIndex--
    // }
    // // 插入
    // if insertIndex +1 != 1{
    //  intArr[insertIndex+1] = insertVal
    // }


    // // 第二次
    // insertVal = intArr[2]
    // insertIndex = 2-1

    // // 从大到小
    // for insertIndex>=0 && intArr[insertIndex] <insertVal {
    //  intArr[insertIndex+1] = intArr[insertIndex]
    //  insertIndex--
    // }
    // // 插入
    // if insertIndex +1 != 2{
    //  intArr[insertIndex+1] = insertVal
    // }


    // // 第三次
    // insertVal = intArr[3]
    // insertIndex = 3-1

    // // 从大到小
    // for insertIndex>=0 && intArr[insertIndex] <insertVal {
    //  intArr[insertIndex+1] = intArr[insertIndex]
    //  insertIndex--
    // }
    // // 插入
    // if insertIndex +1 != 3{
    //  intArr[insertIndex+1] = insertVal
    // }


    // // 第四次
    // insertVal = intArr[4]
    // insertIndex = 4-1

    // // 从大到小
    // for insertIndex>=0 && intArr[insertIndex] <insertVal {
    //  intArr[insertIndex+1] = intArr[insertIndex]
    //  insertIndex--
    // }
    // // 插入
    // if insertIndex +1 != 4{
    //  intArr[insertIndex+1] = insertVal
    // }
    
    // 归纳
    for i:=1;i<len(intArr);i++{

        insertVal := intArr[i]
        insertIndex := i-1

        // 从大到小
        for insertIndex>=0 && intArr[insertIndex] <insertVal {
            intArr[insertIndex+1] = intArr[insertIndex]
            insertIndex--
        }

        // 插入
        if insertIndex +1 != i{
            intArr[insertIndex+1] = insertVal
        }
    }
}



/**
 * 选择排序
 *  var intArr [5]int = [...]int{24,69,80,57,13}
    fmt.Println("排序前:",intArr)
    selectSorting(&intArr)
    fmt.Println("排序后:",intArr)
 */
func selectSorting(intArr *[5]int) {
    // 标准的访问方式:
    // (*intArr)[0] = 2333  等价于  intArr[0] = 2333
    // 1.将第一个最大值 和intArr[0]交换
    // 
    // 
    // // 第一次:
    // max := intArr[0]
    // maxInde :=0
    // // 2.遍历
    // for i := 0+1; i <len(intArr) ; i++ {
    //  if max < intArr[i] {  //比较
    //      max = intArr[i]
    //      maxInde = i
    //  }
    // }
    // // 交换
    // if maxInde != 0 {
    //  intArr[0],intArr[maxInde] = intArr[maxInde],intArr[0]
    // }


    // // 第二次:
    // max = intArr[1]
    // maxInde =1
    // for i := 1+1; i <len(intArr) ; i++ {
    //  if max < intArr[i] {  //比较
    //      max = intArr[i]
    //      maxInde = i
    //  }
    // }
    // // 交换
    // if maxInde != 1 {
    //  intArr[1],intArr[maxInde] = intArr[maxInde],intArr[1]
    // }


    // // 第三次:
    // max = intArr[2]
    // maxInde =2
    // for i := 2+1; i <len(intArr) ; i++ {
    //  if max < intArr[i] {  //比较
    //      max = intArr[i]
    //      maxInde = i
    //  }
    // }
    // // 交换
    // if maxInde != 2 {
    //  intArr[2],intArr[maxInde] = intArr[maxInde],intArr[2]
    // }


    // // 第四次:
    // max = intArr[3]
    // maxInde =3
    // for i := 3+1; i <len(intArr) ; i++ {
    //  if max < intArr[i] {  //比较
    //      max = intArr[i]
    //      maxInde = i
    //  }
    // }
    // // 交换
    // if maxInde != 3 {
    //  intArr[3],intArr[maxInde] = intArr[maxInde],intArr[3]
    // }
    
    // 归纳
    for j:=0;j<len(intArr)-1;j++{
        max := intArr[j]
        maxInde :=j
        for i := j+1; i <len(intArr) ; i++ {
        if max < intArr[i] {  //比较
                max = intArr[i]
                maxInde = i
            }
        }
        // 交换
        if maxInde != j {
            intArr[j],intArr[maxInde] = intArr[maxInde],intArr[j]
        }
    }
}



/**
 * [bubbleSorting 冒泡排序 Bubble Sorting]
 * 从小到大
 * 思路(思想)-》代码(语法)
 * 经过len(intArr)-1论比较
 * 每一轮:比较的次数是递减[4,3,2,1]=len(intArr)-1-第几轮(从零开始的)
 * 即前面的一个数与后面的一个数比较  如果前面的数大就交换
 * @author Jhou Shuai
 * @datetime 2019-05-30T09:53:33+0800
 * @example:
 * var intArr [5]int = [...]int{24,69,80,57,13}
 * bubbleSorting(&intArr)
 */
func bubbleSorting(intArr *[5]int) {
    // 第一轮:
    // 第1次:24与69  [24,69,80,57,13]
    // 第2次:69与80  [24,69,80,57,13]
    // 第3次:80与57  80>57 [24,69,57,80,13]
    // 第4次:80与13  80>13 [24,69,57,13,80]
    // for j := 0; j< 4; j++ {
    //     if (*intArr)[j] > (*intArr)[j+1] {
    //         (*intArr)[j]   = (*intArr)[j] + (*intArr)[j+1]
    //         (*intArr)[j+1] = (*intArr)[j] - (*intArr)[j+1]
    //         (*intArr)[j]   = (*intArr)[j] - (*intArr)[j+1]
    //     }
    // }


    // 第二轮:
    // 第1次:24与69  [24,69,57,13,80]
    // 第2次:69与57  69>57 [24,57,69,13,80]
    // 第3次:69与13  69>13 [24,57,13,69,80]
    // for j := 0; j< 3; j++ {
    //     if (*intArr)[j] > (*intArr)[j+1] {
    //         (*intArr)[j]   = (*intArr)[j] + (*intArr)[j+1]
    //         (*intArr)[j+1] = (*intArr)[j] - (*intArr)[j+1]
    //         (*intArr)[j]   = (*intArr)[j] - (*intArr)[j+1]
    //     }
    // }

    // 第三轮:
    // 第1次:24与57  [24,57,13,69,80]
    // 第2次:57与13  57>13 [24,13,57,69,80]
    // for j := 0; j< 2; j++ {
    //     if (*intArr)[j] > (*intArr)[j+1] {
    //         (*intArr)[j]   = (*intArr)[j] + (*intArr)[j+1]
    //         (*intArr)[j+1] = (*intArr)[j] - (*intArr)[j+1]
    //         (*intArr)[j]   = (*intArr)[j] - (*intArr)[j+1]
    //     }
    // }

    // 第四轮:
    // 第1次:24与13 24>13 [13,24,57,69,80]
    // for j := 0; j< 1; j++ {
    //     if (*intArr)[j] > (*intArr)[j+1] {
    //         (*intArr)[j]   = (*intArr)[j] + (*intArr)[j+1]
    //         (*intArr)[j+1] = (*intArr)[j] - (*intArr)[j+1]
    //         (*intArr)[j]   = (*intArr)[j] - (*intArr)[j+1]
    //     }
    // }
    intArrLen := len(intArr)
    for i := 0; i < intArrLen-1; i++ {
        for j := 0; j< intArrLen-1-i; j++ {
            if (*intArr)[j] > (*intArr)[j+1] {
                (*intArr)[j]   = (*intArr)[j] + (*intArr)[j+1]
                (*intArr)[j+1] = (*intArr)[j] - (*intArr)[j+1]
                (*intArr)[j]   = (*intArr)[j] - (*intArr)[j+1]
            }
        }
    }
    fmt.Println((*intArr))
}

上一篇下一篇

猜你喜欢

热点阅读