[笔记]一道C语言面试题:实现快速排序

题目:输入整数数组List及数组长度n,对其进行快速排序

来源:某500强企业面试题目
思路:可参考这里的Flash动画,非常清晰明了

复杂度:时间复杂度O(n log(n))

//----------------------------------------

// 实现快速排序

// 参考Flash动画 http://www.jcc.jx.cn/xinwen3/news/kj/flash/2004/0426/1306.htm

//----------------------------------------



int Partition(int List[], int L, int R){

  int Pivot = List[L];          // 基准值取第一个



  do{                           // 反复循环

    while(List[R] >= Pivot){    // 从后向前找第一个比基准值小的

      R--;                      // 没找到就左移

      if (L == R){              // 判断L和R是否重合,如果重合,则退出

        List[L] = Pivot;

        return L;

      }

    }



    List[L] = List[R];          // 取出R指向的数字,放入L中

    L++;                        // L右移



    if (L == R){                // 判断L和R是否重合,如果重合,则退出

      List[L] = Pivot;

      return L;

    }



    while (List[L] <= Pivot){   // 从前向后找第一个比基准值大的

      L++;                      // 没找到就右移

      if (L == R){              // 判断L和R是否重合,如果重合,则退出

        List[L] = Pivot;        

        return L;

      }

    }



    List[R] = List[L];          // 取出L指向的数字,放入R中

    R--;                        // R左移



    if (L == R){                // 判断L和R是否重合,如果重合,则退出

      List[L] = Pivot;

      return L;

    }

  }while(true);

}



void QuickSortList(int List[], int L, int R){

  if (L >= R) return;



  int p = Partition(List, L, R);

  QuickSortList(List, L, p - 1);

  QuickSortList(List, p + 1, R);

}



void QuickSort(int List[], int n){

  QuickSortList(List, 0, n-1);

}



//----------------------------------------

// 测试快速排序

//----------------------------------------

void TestQuickSort(void){

  int List[] = {3,5,1,3,2,5,0,1,8,4,11,7};

  int n = 12;

  int i;



  printf("Before: ");

  for (i = 0; i< n - 1; i++) printf("%d, ", List[i]);

  printf("%d\n", List[n-1]);

  

  printf("After: ");

  QuickSort(List, n);

  for (i = 0; i< n - 1; i++) printf("%d, ", List[i]);

  printf("%d\n", List[n-1]);

  

}
Technorati 标签: ,

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