快速排序

     设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

    平均时间复杂度:尽管快速排序的最坏时间为 O(n^2 ), 但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快的,快速排序亦因此而得名。它的平均时间复杂度为 O(n×lgn)
    空间复杂度:快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为 O(lgn), 故递归后所需栈空间为 O(lgn) 。最坏情况下,递归树的高度为 O(n), 所需的栈空间为 O(n) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void quick_sort(int b[], int left, int right)//升序(以left为key值设计的)
{
    int i = left + 1 , j = right;
    int  key = b[ left];
    if (left >= right) return;//结束条件
    while(1)
    {
         while(b [j]> key)j --;//找小于等于key的值,用左边的首个值作为key,保证了j最多只到left,不会越界,也只有在这里才会导致出现i>j
         while(b [i]< key&&i <j) i++;//找大于等于key的值,这里要保证i<j;
               // while(b [j]<key)j --;    //这样就能逆序排序了
               // while(b [i]>key&&     i <j) i++;
         if(i >=j) break;
         {swap(& b[i],&b [j])} //这里交换以后,i的位置就是保存的小于等于key的值,j的位置保存的就是大于等于key的值
         if(b [i]== key)j --;                                               
         else
            i ++;
    }
    if(left!=j )swap(& b[left],&b [j]);
    quick_sort(b ,left, i-1);                                             
    quick_sort(b ,j+ 1,right );
}

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
void quick_sort(int b[], int left, int right)//降序(以right为key值设计)
{
    int i = left, j = right-1;
    int  key = b[right];
    if (left >= right) return;
        while(1)
       {
               while(b[i]>key)i++;
               while(b[j]<key&&i<j)j--;
               if(i>=j)break ;
               {swap(&b[i],&b[j]);}
               if(b[j]==key)i++;
               else
                      j--;
       }
       swap(&b[right],&b[i]);
        
       quick_sort(b,left,i-1);                                             
       quick_sort(b,j+1,right);
}
void swap(int *a,int *b)
{
        
        int t=*a;
       *a=*b;
       *b=t;
        return;
}

  

posted @ 2016-03-16 22:56  copperface  阅读(249)  评论(0编辑  收藏  举报