使用C语言实现快速排序和归并排序
快速排序
采用“分而治之”的思想。
起首选择一个基准pivot
对数据进行分割,将大于基准的元素放在左边,小于基准的元素放在右边
最后使用递归的方式,分别对左、右进行排序。
根据选取分割的方式不同,分为Hoare算法和Lomuto算法
- void swap(int *a,int *b){
- int tmp = *a;
- *a=*b;
- *b=tmp;
- }
复制代码 Lomuto算法
- 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算法
- 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);
- }
- }
复制代码 归并排序
采用“分治”的思想,将一个大数列分为小的数列,在将有序的小数列组合,得到完全有序的数列。
- // 合并两个有序的数组
- 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);
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |