快速排序c语言实现
2020-04-05 18:24
1096 查看
该种方法能够通过洛谷的快速排序习题,该题目网址如下:
洛谷 P1177 快速排序
就这道题而言,如果只是为了通过这一关,直接调用c语言本身的sort函数就可以通过,单位觉得这样通过毫无意义,下面献上我的代码:
首先,我给大家展示的是一种以数组片段的首元素作为基准的代码(这段代码洛谷测试会超时):
void Qs(int a[],int begin,int end) { int item; if(end <= begin || begin < 0) { return; } int i = begin + 1,j = end; int x = a[begin]; while(i-1 < j+1) { while(a[i] < x) { i++; } while(a[j] > x) { j--; } item = a[i]; a[i] = a[j]; a[j] = item; i++; j--; } i--; j++; if(i > j) { item = a[i]; a[i] = a[j]; a[j] = item; item = a[begin]; a[begin] = a[j]; a[j] = item; } Qs(a,begin,j - 1); Qs(a,j + 1,end); }
该方法每次选取数组片段的首元素作为基准,依次从前往后找比基准大的元素,从后往前找比基准小的元素,若找到,则将他们的位置进行交换,当从前向后找和从后向前找的过程出现交叉时,循环结束,然后将基准交换至其应该在的位置,此时,基准以前的元素均比基准小,基准以后的元素均比基准大,然后将基准以前的片段和基准之后的片段继续进行该操作,直至片段中只有一个元素。
下面给出我的主函数部分:
int main(void) { int a[100005] = {}; scanf("%d",&n); for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } a[n] = 2147483647; Qs(a,0,n); for(int i = 0; i < n; i++) { if(i != 0) { printf(" "); } printf("%d",a[i]); } printf("\n"); return 0; }
由于以端点元素作为基准容易出现基准为数组片段中的极值,此时只能将基准的位置交换,其他元素位置均未改变,这种情况效率低下,所以为了提高代码效率,我们可以将基准定为数组片段中间元素,实现代码如下:
void Qs(int a[],int begin,int end) { int item; if(end <= begin || begin < 0) { return; } int i = begin,j = end; int x = a[(begin + end) / 2]; while(i < j) { while(a[i] < x) { i++; } while(a[j] > x) { j--; } if(i <= j) { item = a[i]; a[i] = a[j]; a[j] = item; i++; j--; } } Qs(a,begin,j); Qs(a,i,end); }
这种方法就能通过洛谷的题目了。
下面给出我的主函数部分:
int main(void) { int a[100005] = {}; int n; scanf("%d",&n); for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } ar(a,0,n - 1); for(int i = 0; i < n; i++) { if(i != 0) { printf(" "); } printf("%d",a[i]); } printf("\n"); return 0; }
如有问题欢迎大家提出!
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 快速排序C语言实现
- 快速排序c语言实现
- 快速排序C语言实现
- 快速排序C语言实现
- 快速排序C语言实现,代码中那些容易忽略的细节
- 单链表及快速排序c语言实现
- 快速排序C语言实现(递归)和希尔排序
- 快速排序c语言实现
- android开机自启动的后台Service的实现 .
- Jquery+ashx实现Ajax(转)
- 《算法导论》CLRS算法C++实现(二)P17 归并排序
- C/C++实现模糊控制,借助MATLAB辅助设计和fis.c文件
- Singleton模式的两种实现形式
- 有关Android中Service实现UI更新(Binder的运用)
- 递归方法实现二叉树的创建,遍历
- 用 Ghost 软件实现基于 PXE 的网络硬盘克隆
- 一种简单JDBC数据库连接池的实现
- C#实现接口
- extjs tree checkbox 复选框实现 取值 显示
- SqlServer调用外部程序实现数据同步