多线程归并排序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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值