//
// main.c
// merge_quick_sort
//
// Created by DZ on 11/1/21.
//
#include <stdio.h>
#include <time.h>
#include <string.h>
void merge_sort(int a[] , int len)
{
int mid = len/2 ;
//if array has only two numbers
if(len == 2)
{
if(a[0] > a[1])
{
int tmp = a[0];
a[0] = a[1];
a[1] = tmp;
}
}//if array only has one number left
else if(len == 1) ;
else // if array have more numbers left
{
merge_sort(a, mid);//first half of the array
merge_sort(a+mid, len-mid);//the rest half of the array
int temp[len];
int k = 0;
int i = 0 , j = 0;
//分别两个指针指向两段数组
while( i < mid && j < len-mid)
{
//谁小谁写进temp,然后下标后移
if(a[i] < (a+mid)[j])
{
temp[k++] = a[i++];
}
else
{
temp[k++] = (a+mid)[j++];
}
//当其中一个下标完全读完也就是数组为空,
//其他一个数组直接拷贝进入temp
}
if(i == mid)
{
for(;j < len-mid && k < len ; j++)
temp[k++] = (a+mid)[j];
}
if(j == len-mid)
{
for(;i < mid && k < len ; i++)
temp[k++] = a[i];
}
//从temp拷贝数据到原始数组
memcpy(a,temp,len*sizeof(int));
}
}
void swap(int *array, int a, int b)
{
int tmp;
tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
//找出第k大的数
int quick_sort(int a[] , int left, int right,int k)
{
if(left >= right)
return a[left];
int pivot = right;
int i = left ,j = left;
while(i < right)
{
if(a[i] < a[pivot])
{
swap(a,i,j);
j++;
}
i++;
}
swap(a,j,pivot);
if(k-1 < j)
return quick_sort(a,left,j-1,k);
else if (k-1 > j)
return quick_sort(a,j+1,right,k);
else
return a[k-1];
}
int main(void) {
//计算运行时间
clock_t begin = clock();
int a[]={5, 8, 9, 23, 67, 1, 3, 7, 31, 56};
//printf("%d",sizeof(a)/sizeof(int));
quick_sort(a, 0, 9);
//merge_sort(a, sizeof(a)/sizeof(int));
for(int i = 0 ; i < sizeof(a)/sizeof(int); i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
clock_t end = clock();
double time_comsumption = (double) (end - begin)/CLOCKS_PER_SEC;
printf("sec is :%f\n" ,time_comsumption);
}
归并排序mergeSort
最新推荐文章于 2023-09-01 17:06:57 发布