归并排序
void merge(int arr[],int n,int mid){
int temp[n];
memcpy(temp,arr,n*sizeof(int));
int p=0,q=mid,k=0;
while(p<mid && q<n) arr[k++]=temp[p]<temp[q]?temp[p++]:temp[q++];
if(p<mid) memcpy(arr+k,temp+p,(mid-p)*sizeof(int));
if(q<n) memcpy(arr+k,temp+q,(n-q)*sizeof(int));
}
void merge_sort(int arr[],int n){
if(n<=1) return;
int mid=n/2;
merge_sort(arr,mid);
merge_sort(arr+mid,n-mid);
merge(arr,n,mid);
}
希尔排序
void insert(int arr[],int n,int gap){
for(int i=n-1-gap;i>=0;i-=gap){
if(arr[i+gap]<arr[i]){
swap(arr+i+gap,arr+i);
}
}
}
void insertion_sort(int arr[],int n,int gap){
for(int i=gap;i<=n;i++){
insert(arr,i,gap);
}
}
void shell_sort(int arr[],int n){
for(int i=n/2;i>=1;i/=2){
insertion_sort(arr,n,i);
}
}
可以借助此段代码进行理解
#include<stdio.h>
#include<math.h>
#include<string.h>
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void insert(int arr[],int n,int gap){
printf("%d %d\n",n,gap);
for(int i=n-1-gap;i>=0;i-=gap){
printf("%d %d %d\n",i+gap,i,i);
if(arr[i+gap]<arr[i]){
swap(arr+i+gap,arr+i);
}
}
}
void insertion_sort(int arr[],int n,int gap){
for(int i=gap;i<=n;i++){
printf("000\n");
insert(arr,i,gap);
}
}
void shell_sort(int arr[],int n){
for(int i=n/2;i>=1;i/=2){
insertion_sort(arr,n,i);
}
}
int main(void){
int arr[10]={7,5,6,8,1,3,5,1,5,6};
shell_sort(arr,10);
int i=0;
for(i=0;i<10;i++){
printf("%d\n",arr[i]);
}
}
快速排序
int partition(int arr[],int n){
int key=arr[0];
int p=0,q=n-1;
while(p<q){
while(p<q && arr[q]>=key) q--;
arr[p] = arr[q];
while(p<q && arr[p]<=key) p++;
arr[q] = arr[p];
}
arr[p] = key;
return p;
}
void quick_sort(int arr[],int n){
if(n<=1) return;
int pivot = partition(arr,n);
quick_sort(arr,pivot);
quick_sort(arr+pivot+1,n-pivot-1);
}