快速排序:

平均时间复杂度:O(n*lgn), 最坏 O(n*n),辅助空间 O(n*lgn),不稳定

归并排序:

平均时间复杂度:O(n*lgn), 最坏 O(n*lgn),辅助空间 O(n),稳定

快速排序:

快速排序采用了分治法的思想,把大的问题分解为同类型的小问题。一般分如下步骤:

( 1 )选择一个中枢元素(有很多选法,我的实现里使用第一个元素为中枢的简单方法)

( 2 )以该中枢元素为基准点,将小于中枢的元素放在中枢后集合的前部分,比它大的在集

合后部分,待集合基本排序完成后(此时前部分元素小于后部分元素 ) ,把中枢元素放在合

适的位置。

( 3 ) 根据中枢元素最后确定的位置 , 把数组分成三部分 , 左边的 , 右边的 , 枢纽元素自己 ,

对左边的,右边的分别递归调用快速排序算法即可。

void swap(int array[],int i, int j)

{

static int counter = 1;

int temp;

temp = *(array+i);

*(array+i) = *(array+j);

*(array+j) = temp;

printf("%d%s\n", counter++, "次交换后,数组是:");

for(int n=0; n<10; n++)

{

if( n == i || n == j )

{

printf("%s%d%s%s","(",array[n],")"," ");

}

else

{

printf("%d%s",array[n]," ");

}

}

printf("\n\n");

}

int partition(int array[],int left, int right)

{

//把左右小于key值的元素放到左边,剩下的key右边的则全部大于key

//p

int

p=array[left];

//Put

elements < p to the left side

//Put

elements >= p to the right side

int

i=left,j=left+1;

for(j=left+1;j<=right;j++)

{

if(array[j]

{

i++;

swap(array,i,j);

}

}

//Put p in

the middle slot which index is pivot

swap(array,i,left);

return

i;

}

void quicksort(int array[], int left, int right)

{

//Do nothing

if left <= right

if(left

{

int pivot=partition(array,left,right);

//Recursive quicksort the left parts and right parts

quicksort(array,left,pivot-1);

quicksort(array,pivot+1,right);

}

}

void q_sort(int array[], int size)

{

quicksort(array, 0, size-1);

}

归并排序:

基本原理:归并排序分两步操作:第一步将数组分解成更小的数组,直到数组只有一

个元素为止 , 每次划分点为 ( len – 1 ) /2=mid, 将数组分成 [from,mid] 和 [mid+1,to],

第二步就是

将分解的数组两两合并 , 合并后的数组是有序的 , 直到合并成一个数组为止 , 合并过程中会

用到一个临时数组 , 用来存储合并后的结果 。 每次合并后 , 将数组的数据传给原数组对应的位置。

void Merge(int *arr,int low,int middle,int high)

{

int

i=low; //index for left side

int j=middle+1; //index for right side

int *tempArr; //temp array to store sorted array

int tempIndex = 0; //temp index for temp

array

int elementNum = high-low+1;

//给合并是的临时数组分配空间

tempArr = (int

*)malloc(elementNum*sizeof(int));

if(!tempArr)

{

return;

}

//此时middle两边(0到middle)和(middle+1到high)都是有序的

while( i<=middle

&& j<=high )

{

tempArr[tempIndex++] =

(arr[i]<=arr[j]) ? arr[i++] : arr[j++];

}

// 下面处理可能情况

// 1.middle的右边已经全部被添加了temparr,左边有剩余

while(i<=middle)

{

tempArr[tempIndex++] =

arr[i++];

}

// 2.middle及左边已经全部被添加了temparr,右边有剩余

while(j<=high)

{

tempArr[tempIndex++] =

arr[j++];

}

tempIndex = 0;

for(i=low;i<=high; i++)

{

arr[i]=tempArr[tempIndex++];

}

}

void MergeSort(int arr[],int low,int high)

{

int mid;

if(low

{

//取中间元素

mid=(low+high)/2;

//分为两部分 分别排序

MergeSort(arr,low,mid);

MergeSort(arr,mid+1,high);

//排序后合并

Merge(arr,low,mid,high);

}

}

测试:

int _tmain(int argc, _TCHAR* argv[])

{

int arr[10] =

{39,22,62,81,23,39,79,15,92,25};

//快速排序

//q_sort(arr, 10);

//归并排序

MergeSort(arr,0,9);

printf("%s\n","排序结果是: ");

for(int i=0; i<10; i++)

{

printf("%d%s",arr[i]," ");

}

printf("\n\n\n");

return 0;

}

多线程归并排序C语言,快速排序 和 归并排序  c语言实现相关推荐

  1. c语言快速排序算法代码,c语言快速排序算法示例代码分享

    #include #include #include #define RANDOM(i) (rand()%i) #define N 9    //设置数组长度 //分区操作 int Partition ...

  2. 排序算法乱炖: 快速排序、归并排序、冒泡排序

    一. 快速排序(属于自顶向下) 1. 快速排序原地版 最好情况的时间复杂度:O(nlogn),logn为递归的层数,n为每层递归中总的时间复杂度. 最差情况的时间复杂度:O(n*n) def quic ...

  3. 非递归算法——快速排序、归并排序

    哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的快速排序.归并排序,非递归算法,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ 目录 一.递归的缺陷 1.1 栈是什 ...

  4. [problem]快速排序和归并排序

    最近有时间了解下快速排序和归并排序. 开始觉得很难,一直没有啃这块骨头,现在发现理解了并不难. 快排的思路就是指定一个值,然后将小于他的排到其左边,大于他的排到其右边. 1 #include < ...

  5. 【算法】快速排序与归并排序对比

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  6. 多线程生成随机数组+双线程归并排序(C++实现)

    算法概述 动态数组生成 多线程随机数组生成 双线程归并排序 代码 #include <iostream> #include <thread> #include <ctim ...

  7. 插入排序、选择排序、快速排序以及归并排序(附Python代码)

    排序算法基本原理以及复杂度等知识点可跳转至该博客了解https://www.cnblogs.com/onepixel/p/7674659.html ,本博客主要对排序算法性能进行对比以及记录对比过程发 ...

  8. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

  9. 【Java数据结构与算法】第八章 快速排序、归并排序和基数排序

    第八章 快速排序.归并排序和基数排序 文章目录 第八章 快速排序.归并排序和基数排序 一.快速排序 1.基本介绍 2.代码实现 二.归并排序 1.基本介绍 2.代码实现 三.基数排序 1.基本介绍 2 ...

最新文章

  1. word笔记之选择性粘贴-设置默认粘贴为当前格式
  2. JavaWeb中连接数据库的一般方式与通过JNDI连接池的方式
  3. CAMB, CosmoMC的安装和使用
  4. NHibernate ConfORM Mapping
  5. 转:Eclipse自动补全功能轻松设置
  6. WDS 自动化部署安装 win2008 服务器实验
  7. 记一次php手工注入(mysql)
  8. 元胞自动机(Cellular Automata)
  9. idea设置启动时打开欢迎页
  10. java class类型参数_使用Class对象实例化Java类型参数/ generic
  11. java手动注册filter,SpringBoot如何注册Servlet、Filter、Listener的几种方式
  12. [Luogu 1351] NOIP2014 联合权值
  13. leetcode刷题:z字形变换
  14. Android异常总结--- java.net.SocketTimeoutException: Transport endpoint is not connected
  15. 商务部回应中兴被罚:坚决反对美国用国内法制裁中企
  16. ElasticSearch 查询最多10000条数据
  17. .Net身份验证概述
  18. Go语言适合做什么?
  19. Devc++- 源文件未编译”
  20. java取万位的值,Excel中表格数值进行取万位整数的操作方法

热门文章

  1. “usermod:UID‘0‘already exists”
  2. 消息队列-Metaq(RocketMQ)原理
  3. 【量化课程】01_投资与量化投资
  4. HTTP协议Response
  5. #c拉普拉斯展开求行列式的值
  6. 红米5双清_红米5刷recovery教程_红米5第三方中文recovery下载
  7. 中国顶尖“黑客”团队:一半是历年高考状元
  8. Swift之函数的语法和使用 | CSDN创作打卡
  9. PAC原理及其算法实现
  10. input内容右对齐_STM32学习笔记—DAC基础内容及常见问题