[笔记]一道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 标签: C语言,面试题
posted @ 2011-09-08 01:48  ET民工[源自火星]  阅读(651)  评论(0编辑  收藏  举报