快速排序:

  将待排的序列一分为二,将待排序的第一个值作为基准,比这个值小的放在基准值的前面,比这个值大的放在基准值的后面,然后再将小的部分和大的部分进行一份为二,直到全部分完就已排好序

 

代码如下:

//快速排序
void charge(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;
}

int part_sort(int unsort[], int low, int lenght)
{
    int flag = unsort[low];
    int i = low, j = lenght;
    while(i < j)
    {
        while(i<j && unsort[i] < unsort[j])
            j--;
        charge(unsort[i], unsort[j]);
        while(i<j && unsort[j] > unsort[i])
            i++;
        charge(unsort[i], unsort[j]);
    }
    return i;
}

void quick_sort(int unsort[], int low, int lenght)
{
    if(low < lenght)
    {
        int flag = part_sort(unsort, low, lenght);
        quick_sort(unsort, low, flag-1);
        quick_sort(unsort, flag+1, lenght);
    }
}

 

注意:
  1.运用了递归的思想

  2.划分的时候应该注意有两个标志值i,j  ,i为当前所要分割数组的第一个索引,j是最后一个索引

  eg:

    初始:9,7,2,11,10,16

    第一次分割:基准是9, i=0, j=5

          基准与a[j]比较 若a[j]大 则j进行-- 直到找到一个比基准小的 当找到时进行互换,然后再用基准值与a[i]进行比较,若                                    a[i]大则 i++知道找到一个比基准值大的,互换,依次进行,直到i!<j停止

          具体如下:

          基准与a[j]比较:

          9<16   j--     j=4

          9<10   j--     j=3

          9<11   j--     j=2

          9>2     a[i]与a[j]互换   得到 2,7,9,11,10,16

          基准与a[i]比较:

          9>2   i++    i=1

          9>7       i++    i = 2

          因为 此时  i  !<  j,所以停止,此次为2,7,9,11,10,16

          进行递归的排列{2,7} 和{11,10,16}