[笔记]一道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语言, 面试题

转载于:https://www.cnblogs.com/journeyonmyway/archive/2011/09/08/2170449.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值