1.0快速排序算法

(1)分解 (2)递归求解 (3)合并

int partition(int a[],int p,int r)

{

    int i=p,j=r+1;

    int x=a[p];

    int temp;

    while(1)  //将<x的元素交换到左边元素,>x的元素交换到右边元素

    {

      while(a[++i]<x && i<r);

      while(a[--j]>x);

      if(i>=j)

        break;

      temp=a[i];

      a[i]=a[j];

      a[j]=temp;

      }

      a[p]=a[j];

      a[j]=x;

      return j;

}

void qSort(int a[],int p,int r,int num)

{

    int i;

    if(p<r)

    {

    int q=partition(a,p,r);

    qSort(a,p,q-1,num);  //对左半段排序

    qSort(a,q+1,r,num); //对右半段排序

    }

    printf("快速排序过程:");

    for(i=0;i<num;i++)

    {

      printf("%d ",a[i]);

    }

      printf("\n");

 }

int main()

{

int num;

int i;

int a[100];

printf("请输入数组长度:");

scanf("%d",&num);

printf("请输入数组:\n");

for(i=0;i<num;i++)

{

scanf("%d",&a[i]);

}

qSort(a,0,num-1,num);

printf("快速排序结果:");

for(i=0;i<num;i++)

{

printf("%d ",a[i]);

}

return 0;

}

2.0归并排序算法

将两个有序的左右子表(以mid区分),合并成一个有序的表

void merge(int a[],int first,int mid,int last)

{

int indexA=first;

int indexB=mid+1;

int tempIndex=0;

int i;

static int temp[1000];

while(indexA<=mid && indexB<=last)//进行左右子表的遍历,如果其中有一个子表遍历完,则跳出循环

{

if(a[indexA]<a[indexB])

{

  temp[tempIndex++]=a[indexA++];

}

else

{

  temp[tempIndex++]=a[indexB++];

}

}

    //有一侧子表遍历完后,跳出循环,将另外一侧子表剩下的数一次放入暂存数组中(有序)

while(indexA<=mid)

{

  temp[tempIndex++]=a[indexA++];

}

while(indexB<=last)

{

  temp[tempIndex++]=a[indexB++];

}

//将暂存数组中有序的数列写入目标数组的制定位置,使进行归并的数组段有序

tempIndex=0;

for(i=first;i<=last;i++)

{

  a[i]=temp[tempIndex++];

}

}

void mergeSort(int a[],int first,int last,int num)

{

int i;

if(first<last)//子表的长度大于1,则进入下面的递归处理

{

  int mid=(first+last)/2;

  mergeSort(a,first,mid,num);

  mergeSort(a,mid+1,first,num);

  merge(a,first,mid,last);

}

printf("合并排序时的数组:\n");

for(i=0;i<num;i++)

{

  printf("%d ",a[i]);

}

printf("\n");

}

int main()

{

int num;

int i;

int a[100];

printf("请输入数组长度:");

scanf("%d",&num);

printf("请输入数组:\n");

for(i=0;i<num;i++)

{

  scanf("%d",&a[i]);

}

mergeSort(a,0,num-1,num);

    printf("合并排序后的数组:\n");

for(i=0;i<num;i++)

{

  printf("%d ",a[i]);

    }

      return 0;

 }

快速排序和归并排序(C语言)的更多相关文章

  1. Java实现单链表的快速排序和归并排序

    本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...

  2. 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)

    总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...

  3. 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版

    每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...

  4. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

  5. Java快速排序和归并排序详解

    快速排序 概述 快速排序算法借鉴的是二叉树前序遍历的思想,最终对数组进行排序. 优点: 对于数据量比较大的数组排序,由于采用的具有二叉树二分的思想,故排序速度比较快 局限 只适用于顺序存储结构的数据排 ...

  6. 牛B三人组-快速排序-堆排序-归并排序

    快速排序 随便取个数,作为标志值,这里就默认为索引位置为0的值 记录左索引和右索引,从右往左找比标志值小的,小值和左索引值交换,右索引变化,然后从左往右找比标志值大的,大值和右索引值交换,左索引变化 ...

  7. 数据结构之排序技术:快速排序、归并排序、堆排序(C++版)

    快速排序 #include <iostream> using namespace std; void swap(int num[], int i, int j) { int temp = ...

  8. Scala 实现快速排序和归并排序

    def quickSort1(array: Array[Int]): Array[Int] = { def swap(x: Int, y: Int): Unit = { val tmp = array ...

  9. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

随机推荐

  1. web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址

    web前端/移动端H5博客专家博客大全--值得收藏的前端技术大牛博客地址   Huang Jie Blog .Com-前端开发 http://www.huangjieblog.com/?feed=rs ...

  2. 【BZOJ 1269】文本编辑器

    题目 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对"文本编辑器"做了一个抽象的定义: Move k:将 ...

  3. Prolog奇怪奇妙的思考方式

    今天在<七周七语言>中接触到了prolog,发现它的编程模式和思考方式的确比较奇怪,但同时也非常奇妙,值得学习一下. 1. prolog语言介绍     和SQL一样,Prolog基于数据 ...

  4. 《python核心编程第二版》第7章习题

    7–1. 字典方法.哪个字典方法可以用来把两个字典合并到一起? 答:dict1.update(dict2) 7–2. 字典的键.我们知道字典的值可以是任意的Python 对象,那字典的键又如何呢?请试 ...

  5. Vue折腾记 - (3)写一个不大靠谱的typeahead组件

    Vue折腾记 - (3)写一个不大靠谱的typeahead组件 2017年07月20日 15:17:05 阅读数:691 前言 typeahead在网站中的应用很多..今天跟着我来写一个不大靠谱的ty ...

  6. Drools 7.4.1.Final参考手册(八) 规则语言参考

    规则语言参考 概述 Drools有一个“本地”的规则语言.这种格式在标点符号上非常轻,并且通过“扩展器”支持自然语言和领域特定的语言,使语言能够变形到您的问题领域.本章主要与本机规则格式一致.用于表示 ...

  7. lintcode-83-落单的数 II

    83-落单的数 II 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字. 样例 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 一次遍历,常数级 ...

  8. PokeCats开发者日志(八)

      现在是PokeCats游戏开发的第十四天的中午,很不幸著作权申请又被打回来了.   据说是排版后代码行数还差500行,文档不足十版.我擦,原来他们会自己排版的啊.   只好从项目自带的xml里扣代 ...

  9. QT启动一个工程

    功能描述: 模拟如下页面. 当输入一个字符串时打开对应的应用程序. 实现方法: 1. 建立工程 2. 界面编辑: 3. 在test1.h中添加slot声明 4. test1.cpp中添加slot定义 ...

  10. SQL 取数值小数后两位,但不四舍五入

    select round('1.67789',2,1) /* 1.67*/