//快速排序:

#include <stdio.h>
#define MAX 500000
int s[MAX];
void Q_Sort(int start,int end)
{
int i,j,t;
if ( start >= end ) return ;
t = s[start];
i = start;
j = end;
while ( i < j)
{
while ( s[j] >= t && i < j)
{
j--;
}
s[i] = s[j];
while ( s[i] <= t && i < j)
{
i++;
}
s[j] = s[i];
}
s[i] = t;
Q_Sort(start,i-1);
Q_Sort(i+1,end);
}
int main()
{
int i,n;
while (scanf("%d",&n),n)
{
for ( i = 0 ; i < n ; i++)
{
scanf("%d",&s[i]);
}
Q_Sort(0,n-1);
}
return 0;
}

  


//归并排序

#include <stdio.h>
#define MAX 500000
int a[MAX];
int b[MAX];
void Merge(int left,int mid,int right)
{
int i,j,k;
i = left;
j = mid+1;
k = left;
while ( i <= mid && j <= right )
{
if ( a[i] <= a[j] )
{
b[k++] = a[i++];
}
else
{
b[k++] = a[j++];
}
}
while ( i <= mid )
{
b[k++] = a[i++];
}
while ( j <= right )
{
b[k++] = a[j++];
}
}
void MergeSort(int left,int right)
{
int i,mid;
if ( left < right )
{
mid = ( left + right ) / 2 ;
MergeSort(left , mid);
MergeSort(mid+1 , right);
Merge(left,mid,right);
for ( i = left ; i <= right ; i++)
{
a[i] = b[i];
}
}
}
int main()
{
int i,n;
while (scanf("%d",&n),n)
{
for ( i = 0 ; i < n ; i++)
{
scanf("%d",&a[i]);
}
MergeSort(0,n-1);
}
return 0;
}         

  


//堆排:

#include <stdio.h>
#define MAX 500000
int s[MAX];
void Heapify(int x,int n)
{
if ( x*2+1 <= n)
{
if ( s[x] == s[2*x] && s[x] == s[2*x+1] ) return ;
if ( s[2*x] > s[x] && s[2*x] > s[2*x+1] )
{
s[2*x] ^= s[x] ^= s[2*x] ^= s[x] ;
Heapify(2*x,n);
}
else if ( s[2*x+1] > s[x] && s[2*x+1] > s[2*x] )
{
s[2*x+1] ^= s[x] ^= s[2*x+1] ^= s[x] ;
Heapify(2*x+1,n);
}
else if ( s[2*x+1] == s[2*x] && s[2*x] > s[x])
{
s[2*x] ^= s[x] ^= s[2*x] ^= s[x];
Heapify(2*x,n);
}
}
else if ( x*2 == n )
{
if ( s[2*x] > s[x] )
{
s[2*x] ^= s[x] ^= s[2*x] ^= s[x] ;
Heapify(2*x,n);
}
}
}
void HeapSort(int n)
{
int i,k;
for ( i = n/2 ; i >= 1 ; i--)
{
Heapify(i,n);
}
for ( k = n ; k > 1 ; k--)
{
s[k] ^= s[1] ^= s[k] ^= s[1];
Heapify(1,k-1);
}
}
int main()
{
int i,n;
while (scanf("%d",&n),n)
{
for ( i = 1 ; i <= n ; i++)
{
scanf("%d",&s[i]);
}
HeapSort(n);
for ( i = 1 ; i <= n ; i++)
{
if ( i != n ) printf("%d ",s[i]);
else printf("%d\n",s[i]);
}
}
return 0;
}

  


 
 

c语言 快速排序---归并排序----堆排序的更多相关文章

  1. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  2. 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序

    最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例:  输入:[1,2,3,5,2, ...

  3. <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序

    这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...

  4. 使用python实现归并排序、快速排序、堆排序

    归并排序 使用分治法:分而治之 分: 递归地拆分数组,直到它被分成两对单个元素数组为止. 然后,将这些单个元素中的每一个与它的对合并,然后将这些对与它们的对等合并,直到整个列表按照排序顺序合并为止. ...

  5. 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现

    内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...

  6. C语言快速排序

    复习快速排序,用C语言实现: #include <stdio.h> int quicksort(int begin, int end, int a[], int len); void ma ...

  7. David MacKay:用信息论解释 '快速排序'、'堆排序' 本质与差异

    这篇文章是David MacKay利用信息论,来对快排.堆排的本质差异导致的性能差异进行的比较. 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具. 从信息论的角度来分析算法效率是一件很有 ...

  8. Luogu 1177 - 【模板】快速排序 - [快速排序][归并排序][无旋Treap]

    题目链接:https://www.luogu.org/problemnew/show/P1177 题意:输入 $n$ 以及后续 $n$ 个整数,让你将这 $n$ 个整数从小到大排序输出. 归并排序(用 ...

  9. noi.ac #32 快速排序归并排序应用

    \(des\) 给定长度为 \(n\) 的数组,要求翻转一段区间 \([l, r]\) 使其升序排列. 要求 \(\sum r - l + 1 <= 2e7\) \(sol\) 考虑快速排序,每 ...

随机推荐

  1. A题笔记(6)

    No. 3040 代码量好少,主要考到数学知识 唯一需要注意的是变量的类型 int -2147483648 ~ +2147483647 (4 Bytes) long 在32位机器中 int 类型 和 ...

  2. 前端----表格的具体使用(jquery)

    表格在页面布局中常常会用到.在不同的框架中有不同的使用方法,现在,我先总结下表格在jquery中具体使用: 1.增--insertAfter() function addTr(){ $("& ...

  3. ios 用LLDB查看模拟器文件路径以及一些常用的命令

    我看网络上有好多有关lldb调试命令的介绍,我都看了一遍,都没有这个方法,所以我在这里补充出来,帮助需要的人. 另外附上一些 实用LLDB命令 我们可以使用e命令定义变量 (lldb) e NSStr ...

  4. 虚拟机固定IP访问外网配置

    大家都知道虚拟机网络连接有三种模式,桥接,host-only,NAT,不再赘述. 这里说一下桥接模式下,实现主机与虚拟机通讯,虚拟机与虚拟机通信,虚拟机访问外网,废话不多说,直接说解决方案: 1.本地 ...

  5. 左偏树(Leftist Heap/Tree)简介及代码

    左偏树是一种常用的优先队列(堆)结构.与二叉堆相比,左偏树可以高效的实现两个堆的合并操作. 左偏树实现方便,编程复杂度低,而且有着不俗的效率表现. 它的一个常见应用就是与并查集结合使用.利用并查集确定 ...

  6. upgrade和update的区别

    以前一直没搞清这二个词的意思,特别是linux软件管理的时候,用update和upgrade一直没弄明白,后来终于查清: upgrade一般是指比较重要的升级,或者说是主要的,单独版本的升级,其中软件 ...

  7. mount 挂载光盘

    mount作用 挂载光盘镜像文件.移动硬盘.U盘以及Windows网络共享和UNIX NFS网络共享 mount [-t vfstype] [-o options] device dir mount ...

  8. C# 启动和结束一个线程

    在程序执行中会遇到启动本软件的exe问,或者启用其它的exe文件,已达到执行某些操作的作用.下面是两种最常见的启动exe文件. 1.调用系统dll使用其提供的方法. 引用的dll, [DllImpor ...

  9. 【读书笔记】【CLR via C#】【第一章】The CLR’s Execution Model

    内容提要 本章的目的是对.Net 框架的设计做一个总体的介绍,包括介绍框架中使用的一些技术.定义一些术语.同时会展示从源代码生成应用程序(或者一些包含了一些自定义类型的可以发布的组件),并且会解释程序 ...

  10. RegularExpressionValidator 常用

    RegularExpressionValidator 控件用于验证输入值是否匹配正则表达式指定的模式 属性: ControlToValidate="要验证的控件名称" Valida ...