多线程归并排序C语言,快速排序 和 归并排序 c语言实现
快速排序:
平均时间复杂度: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语言实现相关推荐
- c语言快速排序算法代码,c语言快速排序算法示例代码分享
#include #include #include #define RANDOM(i) (rand()%i) #define N 9 //设置数组长度 //分区操作 int Partition ...
- 排序算法乱炖: 快速排序、归并排序、冒泡排序
一. 快速排序(属于自顶向下) 1. 快速排序原地版 最好情况的时间复杂度:O(nlogn),logn为递归的层数,n为每层递归中总的时间复杂度. 最差情况的时间复杂度:O(n*n) def quic ...
- 非递归算法——快速排序、归并排序
哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的快速排序.归并排序,非递归算法,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ 目录 一.递归的缺陷 1.1 栈是什 ...
- [problem]快速排序和归并排序
最近有时间了解下快速排序和归并排序. 开始觉得很难,一直没有啃这块骨头,现在发现理解了并不难. 快排的思路就是指定一个值,然后将小于他的排到其左边,大于他的排到其右边. 1 #include < ...
- 【算法】快速排序与归并排序对比
算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...
- 多线程生成随机数组+双线程归并排序(C++实现)
算法概述 动态数组生成 多线程随机数组生成 双线程归并排序 代码 #include <iostream> #include <thread> #include <ctim ...
- 插入排序、选择排序、快速排序以及归并排序(附Python代码)
排序算法基本原理以及复杂度等知识点可跳转至该博客了解https://www.cnblogs.com/onepixel/p/7674659.html ,本博客主要对排序算法性能进行对比以及记录对比过程发 ...
- C语言merge sort归并排序算法(附完整源码)
C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...
- 【Java数据结构与算法】第八章 快速排序、归并排序和基数排序
第八章 快速排序.归并排序和基数排序 文章目录 第八章 快速排序.归并排序和基数排序 一.快速排序 1.基本介绍 2.代码实现 二.归并排序 1.基本介绍 2.代码实现 三.基数排序 1.基本介绍 2 ...
最新文章
- word笔记之选择性粘贴-设置默认粘贴为当前格式
- JavaWeb中连接数据库的一般方式与通过JNDI连接池的方式
- CAMB, CosmoMC的安装和使用
- NHibernate ConfORM Mapping
- 转:Eclipse自动补全功能轻松设置
- WDS 自动化部署安装 win2008 服务器实验
- 记一次php手工注入(mysql)
- 元胞自动机(Cellular Automata)
- idea设置启动时打开欢迎页
- java class类型参数_使用Class对象实例化Java类型参数/ generic
- java手动注册filter,SpringBoot如何注册Servlet、Filter、Listener的几种方式
- [Luogu 1351] NOIP2014 联合权值
- leetcode刷题:z字形变换
- Android异常总结--- java.net.SocketTimeoutException: Transport endpoint is not connected
- 商务部回应中兴被罚:坚决反对美国用国内法制裁中企
- ElasticSearch 查询最多10000条数据
- .Net身份验证概述
- Go语言适合做什么?
- Devc++- 源文件未编译”
- java取万位的值,Excel中表格数值进行取万位整数的操作方法
热门文章
- “usermod:UID‘0‘already exists”
- 消息队列-Metaq(RocketMQ)原理
- 【量化课程】01_投资与量化投资
- HTTP协议Response
- #c拉普拉斯展开求行列式的值
- 红米5双清_红米5刷recovery教程_红米5第三方中文recovery下载
- 中国顶尖“黑客”团队:一半是历年高考状元
- Swift之函数的语法和使用 | CSDN创作打卡
- PAC原理及其算法实现
- input内容右对齐_STM32学习笔记—DAC基础内容及常见问题