#include <stdio.h>
#include <stdlib.h>
void quikSort(int[], int, int);
void mergeSort(int[], int, int);
void merge(int[], int, int, int);
void swap(int[], int, int);
int patition(int[], int, int);
int numberOfThree(int[], int, int);
int main(void)
{
int arr[9] = {8, 4, 5, 7, 1, 3, 6, 9, 0};
// mergeSort(arr, 0, 8);
quikSort(arr, 0, 8);
for (int i = 0; i < 9; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
void quikSort(int arr[], int l, int r)
{
if (arr == NULL || l == r)
{
return;
}
if (l < r)
{
int mid = patition(arr, l, r);
quikSort(arr, l, mid - 1);
quikSort(arr, mid + 1, r);
}
}
int patition(int arr[], int l, int r)
{
//使用双指针
int pivot = numberOfThree(arr, l, r);
int low = l;
int high = r;
while (low < high)
{
while (arr[high] >= pivot && high > low)
{
high--;
}
while (arr[low] <= pivot && low < high)
{
low++;
}
if (low <= high)
{
swap(arr, low, high);
}
}
swap(arr, l, low);
return low;
}
void mergeSort(int arr[], int l, int r)
{
if (arr == NULL || l == r)
{
return;
}
int mid = (l + r - 1) / 2;
mergeSort(arr, l, mid); //将左边分成最小长度的数组
mergeSort(arr, mid + 1, r); //将右边分成最小长度的数组
merge(arr, l, mid, r); //合并
}
void merge(int arr[], int l, int mid, int r)
{
int firstL = l; //第一组起点
int secondL = mid + 1; //第二组起点
int firstF = mid; //第一组终点
int secondF = r; //第二组终点
int *tempArr = (int *)malloc(sizeof(int) * (r - l + 1));
int k = 0; //用于指向temp数组当前的哪个位置
while (firstL <= firstF && secondL <= secondF)
{
if (arr[firstL] < arr[secondL])
{
tempArr[k++] = arr[firstL++];
}
if (arr[firstL] > arr[secondL])
{
tempArr[k++] = arr[secondL++];
}
}
if (firstL <= firstF)
{
tempArr[k++] = arr[firstL++];
}
if (secondL <= secondF)
{
tempArr[k++] = arr[secondL++];
}
for (int i = 0, j = l; i < k; i++, j++)
{
arr[j] = tempArr[i];
}
}
void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int numberOfThree(int arr[], int low, int high)
{
int mid = low + ((high - low) >> 1); //右移相当于除以2
if (arr[mid] > arr[high])
{
swap(arr, mid, high);
}
if (arr[low] > arr[high])
{
swap(arr, low, high);
}
if (arr[mid] > arr[low])
{
swap(arr, mid, low);
}
//此时,arr[mid] <= arr[low] <= arr[high]
return arr[low];
}
C语言快速排序,归并排序
最新推荐文章于 2024-09-12 19:02:20 发布