QuickSort

转载 2013年12月03日 16:25:51

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;
}


相关文章推荐

数据结构QuickSort实验

  • 2015年01月05日 10:29
  • 4KB
  • 下载

Princeton Quicksort

  • 2015年06月25日 16:43
  • 4.21MB
  • 下载

算法导论 - QuickSort 快速排序 C++实现

算法导论的快速排序还和一般书上的快速排序是有点不一样的。 当然书习题也给出了一般快速排序的方法,其分区函数学名叫Hoare partition。 书本介绍的排序可以用图看的很清晰: 然后配合C++...
  • kenden23
  • kenden23
  • 2013年11月09日 10:32
  • 12945

quickSort C++ 代码

  • 2013年07月22日 13:58
  • 2KB
  • 下载

QuickSort Algorithm

  • 2016年05月05日 10:27
  • 2KB
  • 下载

快速排序(quicksort)

IT公司招人,无论笔试还是面试,快排基本上都会问到。通常情况下,快排实现有两个函数: void quickSort(int arr[], int left, int right); int parti...

QUICKSORT_LAB

  • 2016年11月12日 15:30
  • 17KB
  • 下载

QuickSort【快速排序C语言版本】

  • 2014年05月07日 15:38
  • 966KB
  • 下载

poj 2299 Ultra-QuickSort :归并排序求逆序数

点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissi...

快速排序——quicksort

  • 2016年04月08日 10:52
  • 167KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QuickSort
举报原因:
原因补充:

(最多只允许输入30个字)