经典内部排序算法总结

概要

  • 冒泡排序
  • 插入排序
  • 简单选择排序
  • 快速排序
  • 希尔排序
  • 归并排序
  • 堆排序
  • 基数排序

冒泡排序
#include<stdio.h>

void BubbleSort(int a[],int size){
    for (int i = 0;i < size - 1;++i) {    //共size - 1趟
        int flag = 0;
        for (int j = 0;j < size - i - 1;++j) {
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
                flag = 1;
            }
        }
        if (!flag) break;
    }
    printf("冒泡排序:");
    for (int i = 0;i < size;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
}

int main() {
    int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
    printf("原始序列:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
    BubbleSort(a, 10);
    printf("\n");
    return 0;
}
插入排序
  #include<stdio.h>
  
  void InsertSort(int a[], int size) {
    int i, j;
    for (i = 1;i < size;++i) {  //从1开始插入
        if (a[i] < a[i - 1]) {  
            int t = a[i];
            for (j = i - 1;t < a[j];--j) {  //找到有序部分插入位置,往后调整
                a[j + 1] = a[j];
            }
            a[j + 1] = t;
        }
    }
    printf("插入排序:");
    for (int i = 0;i < size;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
  }
  
  int main() {
    int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
    printf("原始序列:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
    InsertSort(a, 10);
  
    return 0;
  }
简单选择排序
  #include<stdio.h>
  
  void SelectSort(int a[], int size) {
    for (int i = 0;i < size;++i) {
        for (int j = i + 1;j < size;++j) {
            if (a[i] > a[j]) {
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    printf("选择排序:");
    for (int i = 0;i < size;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
  }
  
  int main() {
    int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
    printf("原始序列:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
    SelectSort(a, 10);
    return 0;
  }
快速排序
  #include<stdio.h>
  
  int Partition(int a[], int low, int high) {
    int pivot = a[low];
    while (low < high) {
        while (low < high&&pivot <= a[high]) --high;
        a[low] = a[high];
        while (low < high&&pivot >= a[low])++low;
        a[high] = a[low];
    }
    a[low] = pivot;
    return low;
  }
  
  void QuickSort(int a[], int low, int high) {
    if (low < high) {
        int pivotopos = Partition(a, low, high);
        QuickSort(a, low, pivotopos - 1);
        QuickSort(a, pivotopos + 1, high);
    }
  }
  
  int main() {
    int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
    printf("原始序列:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
    QuickSort(a, 0, 9);
    printf("快速排序:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
  
    return 0;
  }
希尔排序
  #include<stdio.h>
  
  void ShellSort(int a[], int size) {
    int increment = size;       //增量
    while (increment > 1) {
        increment = increment / 3 + 1;      
        int i, j;
        for (i = increment;i < size;++i) {
            if (a[i] < a[i - increment]) {    
                int t = a[i];
                for (j = i - increment;t < a[j] && j >= 0;j -= increment) {
                    a[j + increment] = a[j];
                }
                a[j + increment] = t;
            }
        }
    } 
    printf("希尔排序:");
    for (int i = 0;i < size;++i) {
        printf("%3d ", a[i]);
    }
  }
  
  int main() {
    int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
    printf("原始排序:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
    ShellSort(a, 10);
    return 0;
  }
归并排序
#include<stdio.h>
#define n 10

void Merge(int a[], int low, int mid, int high) {
    int *b = (int *)malloc(n * sizeof(int));    //辅助数组
    //先复制到辅助数组
    int k, i, j;
    for (k = low;k <= high;++k) {
        b[k] = a[k];
    }
    for (i = low, j = mid + 1, k = i;i <= mid && j <= high;++k) {
        if (b[i] <= b[j]) a[k] = b[i++];
        else a[k] = b[j++];
    }
    while (i <= mid) a[k++] = b[i++];
    while (j <= high) a[k++] = b[j++];
}

void MergeSort(int a[], int low, int high) {
    if (low < high) {
        int mid = (low + high) / 2;
        MergeSort(a, low, mid);
        MergeSort(a, mid + 1, high);
        Merge(a, low, mid, high);
    }
}

int main() {
    int a[n] = { 1,9,3,-1,8,-6,4,5,2,-10 };

    printf("原始序列:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
    
    MergeSort(a, 0, n-1);

    printf("归并排序:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    return 0;
}
堆排序
#include<stdio.h>

void swap(int arr[], int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

void heapify(int tree[], int n, int i) {   
    if (i >= n) return;   //递归出口
    int c1 = 2 * i + 1;
    int c2 = 2 * i + 2;
    int max = i;
    if (c1 < n && tree[c1] > tree[max]) {   //找出父节点和子女结点中最大的结点
        max = c1;
    }
    if (c2 < n && tree[c2] > tree[max]) {
        max = c2;
    }
    if (max != i) {               //若有调整
        swap(tree, max, i);
        heapify(tree, n, max);   //递归继续向下调整
    }
}

void build_heap(int tree[], int n) {   //建堆
    int last_node = n - 1;
    int parent = (last_node - 1) / 2;
    for (int i = parent;i >= 0;i--) {
        heapify(tree, n, i);
    }
}

void heap_sort(int tree[], int n) {
    build_heap(tree, n);
    int i;
    for (i = n - 1;i >= 0;i--) {
        swap(tree, i, 0);       //交换最大的根节点和最后一个节点
        heapify(tree, i, 0);   //将最大的节点剔除(用数量减少表示,即i)
    }
}

int main() {
    int a[10] = { 1,9,3,-1,8,-6,4,5,2,-10 };
    int n = 10;
    printf("原始序列:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    printf("\n");
    heap_sort(a, n);
    printf("堆排序:");
    for (int i = 0;i < 10;++i) {
        printf("%3d ", a[i]);
    }
    return 0;
}
基数排序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 1000000000

//n的exp次方
int get_pow(int n, int exp) {   
    int ans = 1;
    for (int i = 0;i < exp;++i) {
        ans *= n;
    }
    return ans;
}

//获取最大位数,n位需要排n次
int get_maxexp(int a[], int size) {
    int max = -INF, n = 0;
    for (int i = 0;i < size;++i) {
        if (a[i] > max) {
            max = a[i];
        }
    }
    while (max) {
        ++n;
        max /= 10;
    }
    return n;
}

void count_sort(int a[], int size, int n, int exp) {
    int barrel[10][10] = { 0 };   //二维数组记录每个桶内的数
    int b_lenth[10] = { 0 };     //一维数组记录每个桶里数的个数
    int x = get_pow(10, exp - 1);
    for (int i = 0;i < size;++i) {
        int t1 = a[i] / x % 10;
        barrel[t1][b_lenth[t1]] = a[i];
        b_lenth[t1]++;
    }
    //将0-9号桶里的数返回给a[]
    int num = 0;
    for (int i = 0;i <= 9;++i) {
        for (int j = 0;j < b_lenth[i];++j) {
            a[num++] = barrel[i][j];
        }
    }
}

//从倒数第一位调整至最大n位
void RadixSort(int a[], int size, int n) {
    for (int i = 1;i <= n;++i) {
        count_sort(a, size, n, i);
    }
}

int main() {
    int a[10] = { 101,983,205,43,2,777,699,32,75,8765 };
    int maxexp = get_maxexp(a, 10);
    printf("原始序列:");
    for (int i = 0;i < 10;++i) {
        printf("%5d ", a[i]);
    }
    printf("\n");
    RadixSort(a, 10, maxexp);
    printf("基数排序:");
    for (int i = 0;i < 10;++i) {
        printf("%5d ", a[i]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Mered1th/p/10628356.html
今日推荐