归并排序
当我们有两个已经有序的数组的时候,我们可以很容易的将他们合并为一个有序的数组。我们可以依次从左边去出最小的数据放到数组里面,最后将数组拷贝到我们的原数组中。
归并排序:我们将原数组进行分组,分为两个数组,重复上面分组过程,一直到分组为1个数据的两个数组,然后进行合并,最终我们可以的到一个有序的数组。
void MergeAdd(int* arr, int left, int mid, int right, int* temp)
{
int i = left;
int j = mid;
int k = left;
while(i < mid && j <= right)
{
if(arr[i] < arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
}
}
while(i < mid)
{
temp[k++] = arr[i++];
}
while(j <= right)
{
temp[k++] = arr[j++];
}
memcpy(arr+ left, temp+left, sizeof(int) * (right - left + 1));
}
void MergeSort(int* arr, int left, int right, int* temp)
{
int mid = 0;
if(left < right)
{
mid = (left + right) / 2;
MergeSort(arr, left, mid, temp);
MergeSort(arr, mid+1, right, temp);
MergeAdd(arr, left, mid + 1, right, temp);
}
}
快速排序
快速排序:我们首先取出一个基准数(数组第一个数据),将数组中大于基准数的数据放到基准数右侧,小于基准数的数据放到基准数的左侧。
我们先从数组最右侧寻找小于基准数的数据,放到原基准数的位置,然后从左侧寻找大于基准数的数据,放到右侧空出来的位置(从右往左的一个大于基准数的位置),然后重复这两个步骤,最终就可以实现数组中大于基准数的数据放到基准数右侧,小于基准数的数据放到基准数的左侧。
最后我们将基准数左边和右边的数组进行该过程,最终也可以使数组有序。
int partition(int* arr, int low, int high)
{
int i = low;
int j = high;
int cur = arr[low];
if(low < high)
{
while(i < j)
{
while(i < j && arr[j] > cur)
{
j--;
}
if(i < j)
{
arr[i++] = arr[j];
}
while(i < j && arr[i] < cur)
{
i++;
}
if(i < j)
{
arr[j--] = arr[i];
}
}
arr[i] = cur;
}
return i;
}
void QuickSort(int* arr, int low, int high)
{
int index = 0;
if(low < high)
{
index = partition(arr, low, high);
QuickSort(arr, low, index-1);
QuickSort(arr, index+1, high);
}
}