王道c语言-选择排序

选择排序的基本实现步骤:
  1. 从待排序序列中找到最小(或最大)的元素。
  2. 将找到的最小元素与待排序序列的第一个元素交换位置,即将其放置到已排序序列的末尾。
  3. 在剩余未排序元素中继续找到最小(或最大)元素,然后与待排序序列的第二个元素交换位置。
  4. 重复以上步骤,直到所有元素均排序完毕。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

typedef int ElemType;

typedef struct {
    ElemType *elem;
    int TableLen;
} SSTable;

void ST_Init(SSTable &ST, int len) {
    ST.TableLen = len;
    ST.elem = (ElemType *) malloc(ST.TableLen * sizeof(ElemType));
    int i;
    srand(time(NULL));
    for (int i = 0; i < ST.TableLen; ++i) {
        ST.elem[i] = rand() % 100;
    }
}

void ST_print(SSTable ST) {
    for (int i = 0; i < ST.TableLen; ++i) {
        printf("%d ", ST.elem[i]);
    }
    printf("\n");
}

void swap(ElemType &a, ElemType &b) {
    ElemType tmp;
    tmp = a;
    a = b;
    b = tmp;
}

void BubbleSort(ElemType A[], int n) {
    int i, j;
    bool flag;
    for (i = 0; i < n - 1; i++)//i 最多访问到 8
    {
        flag = false;//元素是否发生交换的标志
        for (j = n - 1; j > i; j--)//把最小值就放在最前面
        {
            if (A[j - 1] > A[j]) {
                swap(A[j - 1], A[j]);
                flag = true;
            }
        }
        if (false == flag)
            return;
    }
}

int partition(ElemType *A, int low,int high) {
    ElemType pivot=A[low];
    while (low<high){
        while (low<high&&A[high]>=pivot)
            high--;
        A[low]=A[high];
        while (low<high&&A[low]<=pivot)
            low++;
        A[high]=A[low];
    }
    A[low]= pivot;
    return low;
}

void QuickSort(ElemType *A, int low,int high) {
    if(low<high) {
        int pivot_pos = partition(A, low, high); //分隔值的位置
        QuickSort(A, low, pivot_pos - 1);
        QuickSort(A, pivot_pos + 1, high);
    }
}

void InsertSort(ElemType *A,int n){
    int inserVal,i,j;
    for (i= 1;  i<n ;i ++) { //外层控制要插入的数
        inserVal=A[i];  //保存要插入的数
        //内存控制比较,j>=0,A[j]>inserVal时,A[j]位置元素向后覆盖
        for (j = i-1; j >=0&&A[j]>inserVal ; j--) {  //从后往前比
            A[j+1]=A[j];
        }
        A[j+1]=inserVal;
    }
}

//从待排序序列中找到最小的元素
void SelectSort(ElemType A[],int n){
    int min; //min记录最凶暗元素的下标
    for (int i = 0; i < n; ++i) {
        min=i;
        for (int j = i+1; j <n ; ++j) {
            if(A[j]<A[min]){
                //不在此处交换,因为可能有很多个比min小的,不能保证下标i是最小值
                min=j;
            }
        }
        if(min!=i){
            swap(A[i],A[min]);
        }
    }
}

//从待排序序列中找到最大的元素
void SelectSort1(ElemType A[],int n){
    int max; //min记录最凶暗元素的下标
    for (int i = n-1; i >= 0; --i) {
        max=i;
        for (int j = 0;j<i ; ++j) {
            if(A[j]>A[max]){
                max=j;
            }
        }
        if(max!=i){
            swap(A[i],A[max]);
        }
    }
}

int main() {
    SSTable ST;
    ST_Init(ST, 10);
    ElemType a[10] = {12, 22, 18, 64, 69, 84, 79, 95, 94, 78};
//    memcpy(ST.elem, a, sizeof(a));
    ST_print(ST);
//    BubbleSort(ST.elem, 10);
//    QuickSort(ST.elem, 0,9);
//    InsertSort(ST.elem,10);
    SelectSort(ST.elem,10);
    ST_print(ST);


    return 0;
}

相关推荐

  1. 王道c语言-选择排序

    2024-04-03 06:54:03       14 阅读
  2. 冒泡排序选择排序--C语言

    2024-04-03 06:54:03       18 阅读
  3. C语言实现选择排序算法

    2024-04-03 06:54:03       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 06:54:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 06:54:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 06:54:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 06:54:03       20 阅读

热门阅读

  1. QT 支持window 和 mac下应用程序崩溃检测

    2024-04-03 06:54:03       17 阅读
  2. 自动化标准Makefile与lds

    2024-04-03 06:54:03       18 阅读
  3. ActiViz中的数据集vtkPolyData

    2024-04-03 06:54:03       20 阅读
  4. 数据库设计规范(三大范式)

    2024-04-03 06:54:03       18 阅读
  5. 第八章:k8s如何使用 Service 暴露你的应用

    2024-04-03 06:54:03       14 阅读