排序和顺序统计学——快速排序
来源:互联网 发布:淘宝售后处理方案 编辑:程序博客网 时间:2024/04/30 08:07
一、快速排序
最坏情况O(n^2),平均性能相当好,期望的运行时间为O(nlgn),且其隐含的常数因子很小。另外,它还能够进行原地置换排序。
采用分治模式
分解:数组A[p...r]被划分成两个非空子数组A[p...q-1]和A[q+1...r],使得A[p...q-1]的每个元素都小于等于A[q+1...r];
解决:通过递归调用快速排序对子数组A[p...q-1]和A[q+1...r]排序;
合并:因为两个子数组是原地排序的,不需要将他们合并,整个数组A[p...r]已排序。
/**//*
*Copyright(c) 2008 All rights reserved.
*
*Quick Sort
*Author:Greentea
*Date:01.20
*/
#include <stdio.h>
void Exchange(int *a, int *b)
...{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void QuickSort(int *a, int p, int r)
...{
int q;
if(p < r)
...{
q = Partition(a, p, r);
QuickSort(a, p, q-1);
QuickSort(a, q+1, r);
}
}
int Partition(int *a, int p, int r)
...{
int i, j, x;
i = p - 1;
x = a[r];
for(j = p; j < r; j++)
...{
if(a[j] <= x)
...{
i++;
Exchange(&a[i], &a[j]);
}
}
Exchange(&a[i+1], &a[r]);
return i+1;
}
int main(int argc, char **argv)
...{
int i;
int A[10] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
QuickSort(A, 0, 9);
for(i=0; i<10; i++)
printf("%3d", A[i]);
printf(" ");
return 0;
}
*Copyright(c) 2008 All rights reserved.
*
*Quick Sort
*Author:Greentea
*Date:01.20
*/
#include <stdio.h>
void Exchange(int *a, int *b)
...{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void QuickSort(int *a, int p, int r)
...{
int q;
if(p < r)
...{
q = Partition(a, p, r);
QuickSort(a, p, q-1);
QuickSort(a, q+1, r);
}
}
int Partition(int *a, int p, int r)
...{
int i, j, x;
i = p - 1;
x = a[r];
for(j = p; j < r; j++)
...{
if(a[j] <= x)
...{
i++;
Exchange(&a[i], &a[j]);
}
}
Exchange(&a[i+1], &a[r]);
return i+1;
}
int main(int argc, char **argv)
...{
int i;
int A[10] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
QuickSort(A, 0, 9);
for(i=0; i<10; i++)
printf("%3d", A[i]);
printf(" ");
return 0;
}
二、快速排序(随机化版本)
随机数产生器Random(a, b):返回一个介于a和b之间的整数,(包括a和b),且产生每个整数的可能性都是相同的。
快速排序的随机化版本有个有趣的性质:没有一个特别的输入会导致最坏情况性态,这种算法的最坏情况性态是由随机数产生器决定的。
/**//*
*Copyright(c) 2008 All rights reserved.
*
*Quick Sort
*Author:Greentea
*Date:01.20
*/
#include <stdio.h>
/**//*
*产生介于low - high之间的随机数包括low和high
*Input: low
* high
*Return: random_num
*
*
*/
int Random(int low, int high)
...{
int random_num;
srand((unsigned)time(NULL));
random_num = (rand() % (high - low + 1)) + low;
return random_num;
}
void Exchange(int *a, int *b)
...{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void RandomizedQuickSort(int *a, int p, int r)
...{
int q;
if(p < r)
...{
q = RandomizedPartition(a, p, r);
RandomizedQuickSort(a, p, q-1);
RandomizedQuickSort(a, q+1, r);
}
}
int Partition(int *a, int p, int r)
...{
int i, j, x;
i = p - 1;
x = a[r];
for(j = p; j < r; j++)
...{
if(a[j] <= x)
...{
i++;
Exchange(&a[i], &a[j]);
}
}
Exchange(&a[i+1], &a[r]);
return i+1;
}
int RandomizedPartition(int *a, int p, int r)
...{
int i;
i = Random(p, r);
Exchange(&a[i], &a[r]);
return Partition(a, p, r);
}
int main(int argc, char **argv)
...{
int i;
int A[10] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
RandomizedQuickSort(A, 0, 9);
for(i=0; i<10; i++)
printf("%3d", A[i]);
printf(" ");
return 0;
}
*Copyright(c) 2008 All rights reserved.
*
*Quick Sort
*Author:Greentea
*Date:01.20
*/
#include <stdio.h>
/**//*
*产生介于low - high之间的随机数包括low和high
*Input: low
* high
*Return: random_num
*
*
*/
int Random(int low, int high)
...{
int random_num;
srand((unsigned)time(NULL));
random_num = (rand() % (high - low + 1)) + low;
return random_num;
}
void Exchange(int *a, int *b)
...{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void RandomizedQuickSort(int *a, int p, int r)
...{
int q;
if(p < r)
...{
q = RandomizedPartition(a, p, r);
RandomizedQuickSort(a, p, q-1);
RandomizedQuickSort(a, q+1, r);
}
}
int Partition(int *a, int p, int r)
...{
int i, j, x;
i = p - 1;
x = a[r];
for(j = p; j < r; j++)
...{
if(a[j] <= x)
...{
i++;
Exchange(&a[i], &a[j]);
}
}
Exchange(&a[i+1], &a[r]);
return i+1;
}
int RandomizedPartition(int *a, int p, int r)
...{
int i;
i = Random(p, r);
Exchange(&a[i], &a[r]);
return Partition(a, p, r);
}
int main(int argc, char **argv)
...{
int i;
int A[10] = ...{5, 4, 9, 0, 23, 3, 6, 1, 2, 10};
RandomizedQuickSort(A, 0, 9);
for(i=0; i<10; i++)
printf("%3d", A[i]);
printf(" ");
return 0;
}
- 排序和顺序统计学——快速排序
- 排序和顺序统计学——中位数和顺序统计学
- 排序和顺序统计学——堆排序
- 排序和顺序统计学——线形时间排序
- (二)排序和顺序统计学
- 排序算法(三):快速排序与顺序统计学
- 排序和顺序统计学(算法导论)
- 算法导论之排序和顺序统计学
- 排序—快速排序
- 算法导论 第9章 排序和顺序统计学算法导论
- 排序——快速排序
- 排序——快速排序
- 排序——快速排序
- 排序——快速排序
- 排序——快速排序
- 排序——快速排序
- 排序——快速排序
- 排序——快速排序
- 重装xp后用livecd恢复ubuntu启动项---成功
- hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别
- 设计模式之Builder
- Delphi Open Tools API概述
- 破解网页不让复制的脚本
- 排序和顺序统计学——快速排序
- 设计模式之Prototype
- Abstract Factory
- SQLHELPER文件
- 测试用例--数据访问
- 堆栈溢出(Stack Overflow)的解决方法
- 搬家
- You Have Only One Life
- 雅思考试听力部分常见100词