使用C语言实现快速排序和归并排序
文章目录
快速排序
采用"分而治之"的思想。
首先选择一个基准pivot
对数据进行分割,将大于基准的元素放在左边,小于基准的元素放在右边
最后使用递归的方式,分别对左、右进行排序。
根据选取分割的方式不同,分为Hoare算法和Lomuto算法
c
void swap(int *a,int *b){
int tmp = *a;
*a=*b;
*b=tmp;
}
Lomuto算法
c
int partitionL(int arr[],int low, int high){
int pivot=arr[high];
int i=low-1;
for(int j=low;j<=high-1;j++){
if(arr[j]<=pivot){
i++;
swap(&arr[i],&arr[j]);
}
}
swap(&arr[i+1],&arr[high]);
return i+1;
}
void quickSort(int arr[],int low,int high){
if(low<high){
int pivot = partitionL(arr, low, high);
partitionL(arr, low, pivot-1);
partitionL(arr, pivot+1, high);
}
}
Hoare算法
c
int partitionH(int arr[],int low, int high){
int pivot = arr[(low+high)/2]
int i=low-1;
int j=high+1;
while(1){
do{i++;}while(arr[i]<pivot);
do{j--;}while(arr[j]>pivot);
if(i>=j){
return i;
}
swap(&arr[i], &arr[j])
}
}
void quickSortH(int arr[],int low, int high){
if(low<high){
int pivot = partitionL(arr, low, high);
partitionL(arr, low, pivot);
partitionL(arr, pivot+1, high);
}
}
归并排序
采用"分治"的思想,将一个大数列分为小的数列,在将有序的小数列组合,得到完全有序的数列。
c
// 合并两个有序的数组
void merge(int arr[], int low, int mid, int high){
int n1= mid-low+1;
int n2= high-mid;
int *L = (int *)malloc(n1 * sizeof(int));
int *R = (int *)malloc(n2 * sizeof(int));
int i,j,k;
for(i=0;i<n1;i++){
L[i] = arr[low+i];
}
for(j=0;j<n2;j++){
R[j] = arr[mid + 1 + j];
}
i = 0,j = 0, k=low;
while(i<n1 && j<n2){
if(L[i] <= R[j]){
arr[k++] = L[i++];
}else{
arr[k++] = R[j++];
}
}
while (i<n1) {
arr[k++] = L[i++];
}
while (j<n2) {
arr[k++] = R[j++];
}
free(L);
free(R);
}
void mergeSort(int arr[], int low, int high){
if(low < high){
int mid = low + (high-low)/2;
mergeSort(arr, low. mid);
mergeSort(arr, mid+1, high);
merge(arr, low, mid, high);
}
}