首页 > 代码库 > 快速排序法

快速排序法

    1. #include <stdio.h>
    2. #include <stdlib.h> 
    3.  
    4. void swap(int *x,int *y)  //  交换函数
    5. {
    6.    int temp;
    7.    temp = *x;
    8.    *x = *y;
    9.    *y = temp;
    10. }
    11.  
    12. int choose_pivot(int i,int j )   //取两数平均值函数
    13. {
    14.    return((i+j) /2);
    15. }
    16.  
    17. void quicksort(int list[],int m,int n)   //快速排序函数,m,n分别是左界 右界  比如10个数排序中的 0 和9
    18. {
    19.    int key,i,j,k;
    20.    if( m < n)
    21.    {
    22.       k = choose_pivot(m,n);    求得中间位置的值  
    23.       swap(&list[m],&list[k]);
    24.       key = list[m];
    25.       i = m+1;
    26.       j = n;
    27.       while(i <= j)
    28.       {
    29.          while((i <= n) && (list[i] <= key))
    30.                 i++;
    31.          while((j >= m) && (list[j] > key))
    32.                 j--;
    33.          if( i < j)
    34.                 swap(&list[i],&list[j]);
    35.       }
    36.      // 交换两个元素的位置
    37.       swap(&list[m],&list[j]);
    38.      // 递归地对较小的数据序列进行排序
    39.       quicksort(list,m,j-1);
    40.       quicksort(list,j+1,n);
    41.    }
    42. }
    43.  
    44. void printlist(int list[],int n)
    45. {
    46.    int i;
    47.    for(i=0;i<n;i++)
    48.       printf("%d\t",list[i]);
    49. }
    50.  
    51. void main()
    52. {
    53.    const int MAX_ELEMENTS = 10;
    54.    int list[MAX_ELEMENTS];
    55.  
    56.    int i = 0;
    57.    
    58.    // 产生填充序列的随机数
    59.    for(i = 0; i < MAX_ELEMENTS; i++ ){
    60.      list[i] = rand();
    61.    }
    62.    printf("进行排序之前的序列:\n");
    63.    printlist(list,MAX_ELEMENTS);
    64.    
    65.    // sort the list using quicksort
    66.    quicksort(list,0,MAX_ELEMENTS-1);
    67.  
    68.    // print the result
    69.    printf("使用快速排序算法进行排序之后的序列:\n");
    70.    printlist(list,MAX_ELEMENTS);
    71. }
  1. 这段程序并不难,应该很好看懂,我把过程大致讲一下,首先你的脑子里先浮现一个数组和三个指针,第一个指针称为p指针,在整个过程结束之前它牢牢的指向第一个数,第二个指针和第三个指针分别为lo指针和hi指针,分别指向最左边的值和最右边的值。lo指针和hi指针从两边同时向中间逼近,在逼近的过程中不停的与p指针的值比较,如果lo指针的值比p指针的值小,lo++,还小还++,再小再++,直到碰到一个大于p指针的值,这时视线转移到hi指针,如果 hi指针的值比p指针的值大,hi--,还大还--,再大再--,直到碰到一个小于p指针的值。这时就把lo指针的值和hi指针的值做一个调换。持续这过程直到两个指针碰面,这时把p指针的值和碰面的值做一个调换,然后返回p指针新的位置。

快速排序法