归并排序与快速排序的思想基本一致,唯一不同的是归并排序的基准值是数组的中间元素。
关于快速排序的思想
代码:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void Print(int *arr,int size);
//归并
void Merge_sort(int *arr, int left, int right, int*temp);
void merge(int *arr, int *temp, int left, int mid, int right)
{
int begin1 = left;
int end1 = mid;
int begin2 = mid+1;
int end2 = right;
int index = left;
while (begin1 <= end1&&begin2 <= end2)
{
if (arr[begin1] <= arr[begin2])
{
temp[index] = arr[begin1];
index++;
begin1++;
}
else
{
temp[index] = arr[begin2];
index++;
begin2++;
}
}
while (begin1 <= end1)
{
temp[index++] = arr[begin1++];
}
while (begin2 <= end2)
{
temp[index++] = arr[begin2++];
}
}
void Merge_sort(int *arr, int left, int right,int*temp)
{
if (right - left < 2)
{
InsertSort(arr + left, right - left+1);
return;
}
int mid = left + ((right - left) >> 1);
Merge_sort(arr, left, mid, temp);
Merge_sort(arr, mid+1, right, temp);
merge(arr,temp,left,mid,right);
memcpy(arr, temp, 10*sizeof(int));
}
测试:
#include"quickSort.h"
void TestquickSort()
{
int array[] = {2,5,4,9,3,6,8,7,1,0};
int *temp = (int *)malloc(sizeof(array) / sizeof(array[0])*sizeof(int));
if (temp == NULL)
{
return;
}
//打印
printf("排序前: ");
Print(array, sizeof(array) / sizeof(array[0]));
memcpy(temp, array, sizeof(array) / sizeof(array[0])*sizeof(int));
Merge_sort(array, 0, sizeof(array) / sizeof(array[0])-1, temp);
printf("排序后: ");
Print(array, sizeof(array) / sizeof(array[0]));
}
int main()
{
TestquickSort();
system("pause");
return 0;
}
时间复杂度: o(NlogN)
空间复杂度: o(n)
稳定性: 稳定
适用场景: 适用于外部排序。