快速排序

1、算法描述:

快速排序(Quicksort)是对冒泡排序的一种改进。

2、解答思路:

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

3、实现:

Swift

class QuickSort {
    //找到分割的index
    func partition(array: inout [Int], left : Int, right : Int) -> Int {
        
        var low = left
        var high = right
        let temp = array[low]
        while low < high {
            while low < high && array[high] >= temp {
                high -= 1
            }
            array[low] = array[high]
            while low < high && array[low] <= temp {
                low += 1
            }
            array[high] = array[low]
        }
        array[low] = temp
        print(array)
        return low
    }
    
    //递归
    func quickSort(array : inout [Int], left : Int , right : Int){
        if left < right {
            let mid = partition(array: &array, left: left, right: right)
            quickSort(array: &array, left: left, right: mid - 1)
            quickSort(array: &array, left: mid + 1, right: right)
        }
    }
}

let test = QuickSort()
var array  = [Int](repeating: 0, count: 6)

for index in 0..<6 {
    array[index] = Int(arc4random_uniform(7)) + Int(arc4random_uniform(2)) + 1
}
test.quickSort(array : &array, left: 0, right: array.count - 1)
print(array)

C语言

void quickSort(int array[], int left, int right) {
    if (left>=right) {
        return;
    }
    int low = left;
    int high = right;
    int temp = array[low];
    
    while (low < high) {
        while (low < high && temp <= array[high]) {
            high --;
        }
        array[low] = array[high];
        while (low < high && temp >= array[low]) {
            low ++;
        }
        array[high] = array[low];
    }
    array[low] = temp;
    quickSort(array, left, low - 1);
    quickSort(array, low + 1, right);
    
}

4、分析:

1)、时间复杂度:

时间复杂度为O(nlogn),是一种比较快的排序方式。

2)、空间复杂度:

和冒泡排序一样,需要额外空间为常量级,故空间复杂度为O(1)。

3)、算法稳定性:

假设现有数据:[5, 3, 8, 3, 4,10, 3, 11],这里存在3个3分别用3a,3b,3c表示这三个三。
第一次交换元素,得到:[4, 3a, 3c, 3b, 4, 10, 8, 11 ],原序3b在3c前面,现在3c在3b前面,交换了位置,所以该算法不是稳定算法

5、联系方式

  • - Adrenine
  • 掘金 - Adrenine
  • Blog - Adrenine
  • Github - Adrenine

你可能感兴趣的:(快速排序)