快速排序
2015-05-31 23:01
363 查看
快速排序采用的是分治递归的策略
(1)选取枢纽元:采用三数中值分割法来选取枢纽元,一般的做法是使用左端、右端和中心位置上的三个元素的中值作为枢纽元
(2)分割策略
首先,通过枢纽元与最后的元素交换,使得枢纽元离开要被分割的数据段(即i从第一个元素开始,而j从倒数第二个元素开始)
接着,在分割段要做的是把所有比枢纽元小的元素移到数组左边,而把所有比枢纽元大的元素移到数组的右边。当i和j停止时,i指向一个大于枢纽元的元素,而j指向一个小于枢纽元的元素。此时,若i小于j,则将i,j处的元素交换,否则退出循环
最后,将枢纽元与i所指向的元素交换
快速排序为不稳定的排序,其时间复杂度最差为O(n2),平均为O(nlogn),空间复杂度为O(logn)
void Swap(int *a, int *b);//交换两元素的值
int Median3(int A[], int Left, int Right);//三数中值分割法
void InsertSort(int A[], int size);//插入排序
void Qsort(int A[], int Left, int Right);//快速排序子函数
void QuickSort(int A[], int size);//快速排序函数
int main(void)
{
int A[] = {8,1,4,9,0,4,3,5,4,2,7,7,6,8};
int i, size = sizeof(A)/sizeof(int);
}
void Swap(int *a, int *b)//交换两元素的值
{
int temp;
}
int Median3(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置
{
int Center = (Left + Right)/2;
}
void InsertSort(int A[], int size)
{
int i, j;
int temp;
}
void Qsort(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置
{
int i, j;
int Pivot;//枢纽元
int Cutoff = 3;
}
void QuickSort(int A[], int size)
{
Qsort(A, 0, size-1);
}
另一种实现方法:
void myqort(int *a, int len)
{
}
(1)选取枢纽元:采用三数中值分割法来选取枢纽元,一般的做法是使用左端、右端和中心位置上的三个元素的中值作为枢纽元
(2)分割策略
首先,通过枢纽元与最后的元素交换,使得枢纽元离开要被分割的数据段(即i从第一个元素开始,而j从倒数第二个元素开始)
接着,在分割段要做的是把所有比枢纽元小的元素移到数组左边,而把所有比枢纽元大的元素移到数组的右边。当i和j停止时,i指向一个大于枢纽元的元素,而j指向一个小于枢纽元的元素。此时,若i小于j,则将i,j处的元素交换,否则退出循环
最后,将枢纽元与i所指向的元素交换
快速排序为不稳定的排序,其时间复杂度最差为O(n2),平均为O(nlogn),空间复杂度为O(logn)
void Swap(int *a, int *b);//交换两元素的值
int Median3(int A[], int Left, int Right);//三数中值分割法
void InsertSort(int A[], int size);//插入排序
void Qsort(int A[], int Left, int Right);//快速排序子函数
void QuickSort(int A[], int size);//快速排序函数
int main(void)
{
int A[] = {8,1,4,9,0,4,3,5,4,2,7,7,6,8};
int i, size = sizeof(A)/sizeof(int);
QuickSort(A, size);//快速排序 for(i = 0; i < size; i++) { printf("%d ", A[i]); } printf("\n"); return 0;
}
void Swap(int *a, int *b)//交换两元素的值
{
int temp;
temp = *a; *a = *b; *b = temp;
}
int Median3(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置
{
int Center = (Left + Right)/2;
if(A[Left] > A[Center]) Swap(&A[Left], &A[Center]); if(A[Left] > A[Right]) Swap(&A[Left], &A[Right]); if(A[Center] > A[Right]) Swap(&A[Center], &A[Right]); Swap(&A[Center], &A[Right-1]);//将枢纽元放在数组的倒数第二个位置上,最后一个元素肯定大于枢纽元 return A[Right-1];
}
void InsertSort(int A[], int size)
{
int i, j;
int temp;
for(i = 1; i < size; i++) { temp = A[i]; for(j = i; (j >0) && (A[j-1]) > temp; j--) { A[j] = A[j-1]; } A[j] = temp; }
}
void Qsort(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置
{
int i, j;
int Pivot;//枢纽元
int Cutoff = 3;
if(Left + Cutoff <= Right)//当参与排序的元素个数大于3时 { Pivot = Median3(A, Left, Right); i = Left; j = Right-1; while(1) { while(A[++i] < Pivot){} while(A[--j] > Pivot){} if(i < j) Swap(&A[i], &A[j]); else break; } Swap(&A[i], &A[Right-1]);//将枢纽元与i所指的元素交换 Qsort(A, Left, i-1);//对枢纽元左边的元素进行快速排序 Qsort(A, i+1, Right);//对枢纽元右边的元素进行快速排序 } else//当参与排序的元素个数不大于3时 { InsertSort(A+Left, Right-Left+1);//采用插入排序 }
}
void QuickSort(int A[], int size)
{
Qsort(A, 0, size-1);
}
另一种实现方法:
void myqort(int *a, int len)
{
if (a == NULL || len <= 1) return; int val = a[0]; int start = 0; int end = len-1; while (start < end) { while (start < end) { if (a[end] < val) { a[start++] = a[end]; break; } end--; } while (start < end) { if (a[start] > val) { a[end--] = a[start]; break; } start++; } } a[start] = val; myqort(a, start); myqort(a+start+1, len-start-1);
}
相关文章推荐
- kb-09-线段树--区间合并比较繁
- j-link + gdb 2440裸机
- 纪念逝去的岁月——C++实现一个栈
- Intersection of Two Linked Lists | LeetCode
- 第十一周 项目3 - 点类派生直线类】定义点类Point,并以点类为基类,继承关系
- Qt网络编程
- Jsonp post 跨域方案
- iOS app 发布流程记录
- sql 中Group By的使用
- perl 获取更新部分日志
- 2015年5月做题记录
- 【转】erlang四种监控策略one_for_one、one_for_all、simple_one_for_one、rest_for_one
- socket中select针对阻塞I/O复用注意的问题
- 十分钟学习Python的进阶语法
- 网络爬虫Scrapy
- C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用
- 5月26日作业
- DELL服务器装2003系统
- 网站导航如何优化
- 【数据结构】用C++编写队列及基本操作(包括插入,出队列,摧毁,清空等等)