关闭

QuickSort

541人阅读 评论(0) 收藏 举报
分类:

QuickSort是一种原地排序算法,不稳定。最坏情况是O(n2),平均和最好情况是O(nlogn)

http://stackoverflow.com/questions/2955628/bug-in-quicksort-implementation


伪代码

QUICKSORT(A, p, r)

1    if p < r

2        then q <- PARTITION(A, p, r)

3            QUICKSORT(A, p, q-1)

4            QUICKSORT(A, q+1, r)


QUICKSORT(A, 1, length[A])


PARTITION(A, p, r)

1    x = A[r]

2    i <- p-1

3    for j <- p upto r-1

4        if (A[j] <= x)

5            then     i< i+1

6                exchange A[i] <-> A[j]

7    exchange A[i+1] <-> A[r]

8    return i+1


/* 
 * #include <stdio.h>
 * 
 * void swp(int *a, int *b)
 * {
 *     if (a != b) {
 * 		*a = *a^*b;
 *         *b = *a^*b;
 *         *a = *a^*b;		
 * 	}
 * }
 * 
 * int povit(int a[], int p, int r)
 * {
 * 	int x = a[r];
 *     int i = p-1;
 *     int j;
 * 
 *     for (j = p; j < r; j++) {
 * 		if (a[j] >= x) {
 *             i++;
 *             swp(&a[j], &a[i]);
 * 		}
 * 	}
 *     swp(&a[i+1], &a[r]);
 * 
 *     printf("i = %d, r = %d\n", i, r);
 * 
 *     if (i == r-1) {
 *         i = (p+r)/2;
 *         printf("%d\n", i);
 *         return i;		
 * 	}
 * 
 *     return i+1;
 * }
 * 
 * void quicksort(int a[], int p, int r)
 * {
 * 	if (p < r) {
 *         int q;
 * 		q = povit(a, p, r);
 *         quicksort(a, p, q-1);
 *         quicksort(a, q+1, r);
 * 	}
 * }
 * 
 * int main(void)
 * {
 *     int i = 0;
 *     /\* 
 *      * int a[9] = {
 * 	 * 	0, 2, 8, 7, 1, 3, 5, 6, 4
 * 	 * };
 * 	 *\/
 *     int a[13] = {
 * 		0, 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21
 * 	};
 * 	
 *     /\* 
 *      * int a[13] = {
 * 	 * 	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 * 	 * };
 *      *\/
 * 
 *     quicksort(a, 1, 12);
 * 
 *     for (i = 1; i < 13; i++) {
 * 		printf("%d ", a[i]);
 * 	}
 * //    printf("\n");
 * 
 * 	return 0;
 * }
 */
#include <stdio.h>


void swp(int *a, int *b)
{
  int tmp = *a;
  *a = *b;
  *b = tmp;
}


int partition(int a[], int p, int q)
{
   int i = p, j;
   int x = a[p];


   for (j = p+1; j <= q; j++) {
     if (a[j] <= x) {
	i++;
	swp(&a[i], &a[j]);
     }
   }
   swp(&a[i], &a[p]);


   return i;
}


void quicksort(int a[], int p, int q)
{
  int r = partition(a, p, q);


  quicksort(a, p, r-1);
  quicksort(a, r+1, q);
}


int main(void)
{
  int i;
  int a[] = {0, 1, 8, 9, 3, 5, 2, 6, 4, 7 ,0};


  quicksort(a, 1, 10);


  for (i = 1; i <= 10; i++) {
    printf("%d ", a[i]);
  }


  return 0;
}
#include <stdio.h>

void swp(int *a, int *b)
{
	int tmp = *a;
    *a = *b;
    *b = tmp;
}

void qsort(int a[], int p, int r)
{
    if (p < r) {
		int x = a[p];
		int i = p;
		int j = r +1;

		while (1) {
			do {
				i++;
			} while (i <= r && a[i] < x);

			do {
				j--;
			} while (a[j] > x);

			if (i >= j)
				break;

			swp(&a[i], &a[j]);
		}
		swp(&a[p], &a[j]);

		qsort(a, p, j-1);
		qsort(a, j+1, r);
	}
}

int main(void)
{
	int i;
    int a[13] = {
		0, 13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21
	};

    qsort(a, 1, 12);

    for (i = 1; i < 13; i++) {
		printf("%d ", a[i]);
	}

    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:660758次
    • 积分:8473
    • 等级:
    • 排名:第2283名
    • 原创:154篇
    • 转载:111篇
    • 译文:65篇
    • 评论:81条
    文章分类
    最新评论