Chinaunix首页 | 论坛 | 博客
  • 博客访问: 501641
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-07-02 10:01:54

2016.8.17改

快速排序的实现

伪代码:
Quicksort(A[l...r])
    if (l < r)
        s<-partition(A[l...r])
        Quicksort(A[l...s-1])
        Quicksort(A[s+1...r])
HoarePartition(A[l...r])
    //以第一个元素为中轴对字数组进行划分
    p <- A[l]
    i <- l;j <- r+1
    repeat
         repeat i <- i+1 until A[i] >= p
          repeat j <- j-1  until A[j] <= p
          swap(A[i],a[j])
    until i >= j
    swap(A[i],A[j])//当i >= j撤销最后一次交换
    swap(A[l],A[j])
    return j
c语言代码如下:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define swap(t,x,y) (t = (x),x = (y),y = (t))
  4. int partition(int *a,int lo,int hi){
  5.     int i = lo,j = hi+1;
  6.     int v = a[lo];
  7.     int temp = 0;
  8.     while (1){
  9.         while (a[++i] < v) if (i == hi) break;
  10.         while (a[--j] > v) if (j == lo) break;
  11.         if (i >= j) break;
  12.         swap(temp,a[i],a[j]);
  13.     }
  14.     swap(temp,a[lo],a[j]);
  15.     return j;
  16. }
  17. void quicksort(int *a,int lo,int hi){
  18.     if (lo >= hi) return;
  19.     int s = partition(a,lo,hi);
  20.     quicksort(a,lo,s-1);
  21.     quicksort(a,s+1,hi);

  22. }
  23. int main()
  24. {
  25.     printf("请输入数组元素个数len = ");
  26.     int len = 0;
  27.     scanf("%d",&len);
  28.     int a[len];
  29.     int i = 0;
  30.     for (i = 0;i < len;i++){
  31.          printf("请输入第%d个:"i+1);
  32.          scanf("%d",&a[i]);//注意&
  33.     }
  34.     quicksort(a,0,len-1);
  35.     for (i = 0;i < len;i++)
  36.     {
  37.         printf("%d ",a[i]);
  38.     }
  39.     printf("\n");
  40.     return 0;

  41. }
寻找最小的k个数;

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define swap(t,x,y) (t = (x),x = (y),y = (t))
  4. int partition(int *a,int lo,int hi){
  5.     int i = lo,j = hi+1;
  6.     int v = a[lo];
  7.     int temp = 0;
  8.     while (1){
  9.         while (a[++i] < v) if (i == hi) break;
  10.         while (a[--j] > v) if (j == lo) break;
  11.         if (i >= j) break;
  12.         swap(temp,a[i],a[j]);
  13.     }
  14.     swap(temp,a[lo],a[j]);
  15.     return j;
  16. }
  17. int quicksort(int *a,int lo,int hi,int k){
  18.     //if (lo >= hi) return;
  19.     int s = partition(a,lo,hi);
  20.     if (s == lo+k-1) return s;
  21.     else if (s > lo+k-1) quicksort(a,lo,s-1,k);
  22.     else quicksort(a,s+1,hi,lo+k-1-s);

  23. }
  24. int main()
  25. {
  26.     printf("请输入数组元素个数len = ");
  27.     int len = 0;
  28.     scanf("%d",&len);
  29.     int a[len];
  30.     int i = 0;
  31.     for (i = 0;i < len;i++){
  32.          printf("请输入第%d个:",i+1);
  33.          scanf("%d",&a[i]);//注意&
  34.     }
  35.     int s = quicksort(a,0,len-1,5);
  36.     for (i = 0;i <= s;i++)
  37.     {
  38.         printf("%d ",a[i]);
  39.     }
  40.     printf("\n");
  41.     return 0;

  42. }
时间复杂度O(n)
阅读(837) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~