C语言排序算法的演示

**以冒泡排序法、选择排序法、插入排序法和快速排序法实现从小到大排序**

1)冒泡排序法
依次比较相邻两个数的大小,将较大的数放到后面,然后依次循环到最后一个数,那么这最后一个数就是这一列数中最大的一个,然后在用相同的办法比较剩余的数,每次都可以比较出最大的一个数,直到排到最后一个数为止。
2)选择排序法
用一列数字(n个)中最后一个位置数字(第n个)和前n-1个数字依次比较,把较大的放到最后一个位置,一次循环下来可以找到最大的数。然后用相同的办法,把倒第二个数字(第n-1个)和前n-2个数字依次比较,找到第二大的,放到倒第二的位置上。以此规律排出大小
3)插入排序法
假设一列数字前n个数字已经排好了序(从小到大),把n+1个数字依次和前n个数字比较,把它插入到合适的位置上。
4)快速排序法
快速排序是找出一个元素(理论上可以随便找一个)作为基准(base),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

/*
    排序算法演示(从小到大排序)
 */
#include 
//冒泡排序算法
void bubble_sort(int *p_num, int size){
    int num = 0, num1 = 0, tmp = 0;
    for(num = size - 1; num >= 1; num--){//每次把一个合适的数字(最大数)放在下标为num的位置上
        for(num1 = 0; num1 <= num - 1; num1++){
            //下标为num1和num1+1的存储区内容做顺序调整
            if(*(p_num + num1) > *(p_num + num1 + 1)){
                tmp = *(p_num + num1);
                *(p_num + num1) = *(p_num + num1 + 1);
                *(p_num + num1 + 1) = tmp;
            }
        }
    }
}

//选择排序算法
void choice_sort(int *p_num, int size){
    int num = 0, num1 = 0, tmp = 0;
    for(num = size - 1; num >= 1; num--){ //每次把一个合适的数字(最大数)放在下标为num的位置上 
        for(num1 = 0; num1 <= num - 1; num1++){ 
            //下标为num1和num的存储区内容做顺序调整
            if(*(p_num + num1) > *(p_num + num)){
                tmp = *(p_num + num1);
                *(p_num + num1) = *(p_num + num);
                *(p_num + num) = tmp;
            }
        }
    }
}

//插入排序算法
void insert_sort(int *p_num, int size){
    int num = 0, num1 = 0, tmp = 0;
    for(num = 1; num <= size - 1; num++){
        //每次把下标为num存储区的数字插入到前面合适的位置上
        for(num1 = num - 1; num1 >= 0; num1--){
            //对下标为num1和num1+1存储区里的数字做顺序调整
            if(*(p_num + num1) > *(p_num + num1 + 1)){
                tmp = *(p_num + num1);
                *(p_num + num1) = *(p_num + num1 + 1);
                *(p_num + num1 + 1) = tmp;
            }
            else{
                break;
            }
        }
    }
}

//快速排序算法
void quick_sort(int *p_num, int size){
    int base = *p_num, tmp = 0, left = 0;
    int *p_start = p_num, *p_end = p_num + size - 1;
    if(size <= 1){
        return;
    }
    while(p_start < p_end){
        //对未处理过的数字中两端数字做顺序调整,其中一定包含基准数字
        if(*p_start > *p_end){
            tmp = *p_start;
            *p_start = *p_end;
            *p_end = tmp;
        }
        //如果某个指针捆绑的存储区里是基准数字就把另一个指针向中间移动
        if(*p_start == base){
            p_end--;
        }
        else{
            p_start++;
        }
    }
    left = p_start - p_num;   //计算左半边存储区(数字)个数
    //对左半边数字进行快速排序
    quick_sort(p_num, p_start - p_num);
    //对右半边数字进行快速排序
    quick_sort(p_start + 1, size - left - 1);
}

int main(){  //进行测试
    int arr[] = {20, 11, 17, 31, 25, 42, 6, 21, 13, 8};
    int num = 0;
    bubble_sort(arr, 10);
    for(num = 0; num <= 9; num++){
        printf("%d ",arr[num]);
    }
    printf("\n");
    choice_sort(arr, 10);
    for(num = 0; num <= 9; num++){
        printf("%d ",arr[num]);
    }
    printf("\n");
    insert_sort(arr, 10);
    for(num = 0; num <= 9; num++){
        printf("%d ",arr[num]);
    }
    printf("\n");
    quick_sort(arr, 10);
    for(num = 0; num <= 9; num++){
        printf("%d ",arr[num]);
    }
    printf("\n");
    return 0;
}

你可能感兴趣的:(c语言数据结构)