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


0005算法笔记——【分治法】快速排序

1、未优化的快速排序        快速排序的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序...
  • liufeng_king
  • liufeng_king
  • 2013年01月07日 21:37
  • 5652

难以写对的quicksort

摘要:quicksort是Donald发明的算法,是平均性能最好的内排序算法。本文通过对照quicksort的标准写法和自己的写法,发现了一些隐藏的编程陷阱,故记录下来以供学习交流。   关键字:C/...
  • cteng
  • cteng
  • 2014年09月22日 13:29
  • 1148

快排(QuickSort)的java语言的实现

快速排序快排的思想与前面所介绍的归并排序的思想类似,也是采用了分治法 算法思想如下: 第一步:分解,数组arr[l..r]别分为两个子数组arr[l..q-1]和arr[q+1..r],使...
  • u010412719
  • u010412719
  • 2015年05月31日 19:17
  • 1371

数据结构QuickSort实验

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

Princeton Quicksort

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

quickSort C++ 代码

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

QuickSort Algorithm

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

pku acm 2299 Ultra-QuickSort代码

  • 2008年03月29日 00:11
  • 2KB
  • 下载

Kruskal+quicksort+UFset

  • 2014年12月11日 11:18
  • 3KB
  • 下载

QUICKSORT_LAB

  • 2016年11月12日 15:30
  • 17KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QuickSort
举报原因:
原因补充:

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