首页 > 其他分享 >插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序的C语言实现

插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序的C语言实现

时间:2024-11-07 16:46:01浏览次数:3  
标签:right temp int 插入排序 冒泡排序 largest 排序 void left


#include <stdio.h>
#include <stdlib.h>
 
// 插入排序
void InsertSort(int A[], int n) {
    int i, j, temp;
    for (i = 1; i < n; i++) {
        temp = A[i];
        j = i - 1;
        while (j >= 0 && A[j] > temp) {
            A[j + 1] = A[j];
            j--;
        }
        A[j + 1] = temp;
    }
}
 
// 二分插入排序
void InsertSort2(int A[], int n) {
    int i, j, low, high, mid, temp;
    for (i = 1; i < n; i++) {
        temp = A[i];
        low = 0;
        high = i - 1;
        while (low <= high) {
            mid = (low + high) / 2;
            if (A[mid] > temp)
                high = mid - 1;
            else
                low = mid + 1;
        }
        for (j = i - 1; j >= high + 1; --j)
            A[j + 1] = A[j];
        A[high + 1] = temp;
    }
}
 
// 希尔排序
void ShellSort(int A[], int n) {
    int i, j, gap;
    for (gap = n / 2; gap > 0; gap /= 2) {
        for (i = gap; i < n; i++) {
            int temp = A[i];
            for (j = i; j >= gap && A[j - gap] > temp; j -= gap) {
                A[j] = A[j - gap];
            }
            A[j] = temp;
        }
    }
}
 
// 冒泡排序
void BubbleSort(int A[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (A[j] > A[j + 1]) {
                temp = A[j];
                A[j] = A[j + 1];
                A[j + 1] = temp;
            }
        }
    }
}
 
// 快速排序(递归实现)
void QuickSort(int A[], int low, int high) {
    int i = low, j = high;
    int pivot = A[(low + high) / 2];
    int temp;
    while (i <= j) {
        while (A[i] < pivot) i++;
        while (A[j] > pivot) j--;
        if (i <= j) {
            temp = A[i];
            A[i] = A[j];
            A[j] = temp;
            i++;
            j--;
        }
    }
    if (low < j) QuickSort(A, low, j);
    if (i < high) QuickSort(A, i, high);
}
void QuickSortWrapper(int A[], int n) {
    QuickSort(A, 0, n - 1);
}
 
// 简单选择排序
void SelectionSort(int A[], int n) {
    int i, j, minIdx, temp;
    for (i = 0; i < n - 1; i++) {
        minIdx = i;
        for (j = i + 1; j < n; j++) {
            if (A[j] < A[minIdx]) {
                minIdx = j;
            }
        }
        temp = A[i];
        A[i] = A[minIdx];
        A[minIdx] = temp;
    }
}
 
// 堆排序(最大堆)
void Heapify(int A[], int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    if (left < n && A[left] > A[largest])
        largest = left;
    if (right < n && A[right] > A[largest])
        largest = right;
    if (largest != i) {
        int swap = A[i];
        A[i] = A[largest];
        A[largest] = swap;
        Heapify(A, n, largest);
    }
}
void HeapSort(int A[], int n) {
	int i;
    for (i = n / 2 - 1; i >= 0; i--)
        Heapify(A, n, i);
    for (i = n - 1; i > 0; i--) {
        int swap = A[0];
        A[0] = A[i];
        A[i] = swap;
        Heapify(A, i, 0);
    }
}
// 注意:上面的Heapify函数在HeapSort中被错误地调用了,因为Heapify的原型应该是接受父节点索引,
// 但在HeapSort中我们需要重新堆化从0到i-1的子树,所以我们需要一个不同的方法或者调整Heapify的调用方式。
// 下面的HeapSort修正版使用了一个辅助函数来调整堆。
void HeapAdjust(int A[], int n, int i) {
    int largest, left, right;
    largest = i;
    left = 2 * i + 1;
    right = 2 * i + 2;
    if (left < n && A[left] > A[largest])
        largest = left;
    if (right < n && A[right] > A[largest])
        largest = right;
    if (largest != i) {
        int swap = A[i];
        A[i] = A[largest];
        A[largest] = swap;
        HeapAdjust(A, n, largest);
    }
}
void HeapSortFixed(int A[], int n) {
	int i;
    for ( i = n / 2 - 1; i >= 0; i--)
        HeapAdjust(A, n, i);
    for ( i = n - 1; i > 0; i--) {
        int swap = A[0];
        A[0] = A[i];
        A[i] = swap;
        HeapAdjust(A, i, 0);
    }
}
 
// 归并排序(递归实现)
void Merge(int A[], int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;
	int i,j,k;
    int* L = (int*)malloc(n1 * sizeof(int));
    int* R = (int*)malloc(n2 * sizeof(int));
    for ( i = 0; i < n1; i++)
        L[i] = A[left + i];
    for ( j = 0; j < n2; j++)
        R[j] = A[mid + 1 + j];
    i = 0, j = 0, k = left;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            A[k] = L[i];
            i++;
        } else {
            A[k] = R[j];
            j++;
        }
        k++;
    }
    while (i < n1) {
        A[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
        A[k] = R[j];
        j++;
        k++;
    }
    free(L);
    free(R);
}
void MergeSort(int A[], int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;
        MergeSort(A, left, mid);
        MergeSort(A, mid + 1, right);
        Merge(A, left, mid, right);
    }
}
void MergeSortWrapper(int A[], int n) {
    MergeSort(A, 0, n - 1);
}


int main() {
    int A[10] = {2, 35, 1, 45, 51, 3, 56, 12, 8, 5};
	int i;
    // 输出排序后的数组
	HeapSortFixed(A,10);
    for (i = 0; i < 10; i++) {
        printf("%d ", A[i]);
    }
    printf("\n");

    return 0;
}

标签:right,temp,int,插入排序,冒泡排序,largest,排序,void,left
From: https://blog.csdn.net/buwangchuxinking/article/details/143599323

相关文章

  • 链表的插入排序
    #include<stdio.h>#include<stdlib.h>//定义链表节点结构typedefstructNode{intdata;structNode*next;}Node;//创建新节点Node*createNode(intdata){Node*newNode=(Node*)malloc(sizeof(Node));newNode->data=data;newN......
  • 软件设计师:排序算法总结
    一、直接插入排序方式:从第一个数开始,拿两个数比较,把后面一位跟前面的数比较,把较小的数放在前面一位二、希尔排序方式:按“增量序列(步长)”分组比较,组内元素比较交换 假设初始关键字:48   37   64   96   75   12   26   58   54   3,有......
  • 常考的排序算法
    冒泡排序#include<iostream>#include<string>usingnamespacestd;//voidShellsort(intA[],intn)//{//   intd,i,j;//   for(d=n/2;d>=1;d=d/2)//   {//      for(i=d+1;i<=n;i++)//      {//     ......
  • 第十三届蓝桥杯Python 大学 B 组 数位排序
    数位排序问题描述小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。例如,2022排在409前面,因为2022的数位之和是6,小于409的数位之和13。又如,......
  • 100种算法【Python版】第51篇——希尔排序
    本文目录1算法步骤2算法示例3python代码3.1代码说明3.2复杂度分析4算法优化4.1Shell原始增量序列4.2Hibbard增量序列4.3Knuth增量序列4.4Sedgewick增量序列4.5Tokuda增量序列4.6Pratt增量序列5不同的增量序列的效率对比希尔......
  • 双路快速排序和三路排序算法
    双路快速排序一、概念及其介绍双路快速排序算法是随机化快速排序的改进版本,partition过程使用两个索引值(i、j)用来遍历数组,将 <v 的元素放在索引i所指向位置的左边,而将 >v 的元素放在索引j所指向位置的右边,v 代表标定值。二、适用说明时间和空间复杂度同随机化快速排......
  • 排序算法详细总结
    算法定义:算法是解决特定问题的明确步骤集合。算法的效率通常用时间复杂度和空间复杂度来衡量。排序算法定义:排序算法是计算机科学中用于对元素序列进行排序的一系列算法。排序算法在各种应用中都非常常见,从简单的数据处理到复杂的数据库和搜索引擎优化。分类:冒泡排序(Bubb......
  • 冒泡排序——超详细解释
     一、什么是冒泡排序?1、就是相邻的比较大小,然后交换位置,比如【1,3,2,4】(小放前,大放后)。2、那1跟3比较,不需要交换;3跟2比较,交换;此时更新了列表[1,2,3,4];3跟4比较,不交换。3、4后面没有值了,我们不需要再一次比较。二、代码解析1、可以看到长度是8,但我们-1变成7躺,就少一次循环,优......
  • 11.5 非递归的归并排序
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintn;inthelp[1008611];intarr[1008611];voidmerge(intl,intm,intr){inti=l;inta=l;intb=m+1;while(a<=m&&b<=r){help[i++]=arr[a]......
  • 数据结构之排序
    1.直接插入排序  (1)总体思路:(排升序):arr[end]比tmp小,就已经是升序的了,本次不需要调整,直接end+1进入下一环;arr[end]比tmp大,说明不是升序,则让arr[end+1]=arr[end],同时end--,让end与tmp循环比较,直至arr[end]<tmp为止,如果此时end已经变为负数,说明end所指的数据是目前来说最大的,......