C语言进阶——基于数组的排序

普通选择排序
1、实现原理和思想(升序):
1)在未排序的数组中,选择首元素与其后元素进行比较,若其后元素比首元素大,则两元素交换,直至比较到最后一个元素,这是第一轮比较,得到首元素有序。
2)接下来从第2个,第3个元素…重复1)的步骤,直至剩下最后一个元素,则最后一个元素也是有序,是本组元素的最大值。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define len 10
typedef enum{
    EROOR,SUCCESS
}STATUS;
STATUS selectSort(int *arr,int n){

    for(int i = 0;i<len-1;i++){
        for(int j = i+1;j<len;j++){
            if(arr[i]>arr[j]){
                arr[i]^= arr[j];
                arr[j]^= arr[i];
                arr[i]^= arr[j];
            }
        }
    }

    return SUCCESS;
}
int main(void){

    srand(time(NULL));
    int arr[len];
    for(int i = 0;i<len;i++){
        arr[i] = rand()%100+1;
    }

    selectSort(arr,len);

    for(int i = 0;i<len;i++){
        printf("%5d",arr[i]);
    }
    return 0;
}


选择排序优化——比而不换
此优化是借助记录每次比较较小值的位置,直到最后一个元素,然后比较较小值的位置和待交换元素位置是否相同,不同说明不是同一个元素则交换

STATUS selectSort(int *arr,int n){
    int idx;
    for(int i = 0;i<len-1;i++){
        idx = i;
        for(int j = i+1;j<len;j++){
            if(arr[idx]>arr[j])
                idx = j;
        }

        if(idx != i){
            arr[i]^= arr[idx];
            arr[idx]^= arr[i];
            arr[i]^= arr[idx];
        }
    }

    return SUCCESS;
}


普通冒泡排序
1、冒泡排序的步骤和思想(升序),其实就是邻近的数据两两交换,第一轮下来最后一个元素就是本组元素的最大值,接下来的元素都是重复此步骤。

//冒泡排序
STATUS popSort(int *arr,int n){

    for(int i = 0;i<n-1;i++){
        for(int j = 0;j<n-i-1;j++){
            if(arr[j]>arr[j+1]){
                arr[j] ^= arr[j+1];
                arr[j+1] ^= arr[j];
                arr[j] ^= arr[j+1];
            }
        }
    }
} 


冒泡排序优化——减少不必要的比较循环
思想:若一组数据,有序,那么只需进行一轮比较,判断这轮比较中有没有数据进行交换,若无说明数据有序,无序再进行比较,根据这个结论,设计得到这段优化代码

//冒泡排序
STATUS popSort(int *arr,int n){

    int flag = 0;
    for(int i = 0;i<n-1;i++){
        for(int j = 0;j<n-i-1;j++){
            if(arr[j]>arr[j+1]){
                arr[j] ^= arr[j+1];
                arr[j+1] ^= arr[j];
                arr[j] ^= arr[j+1];
                flag = 1;
            }
        }
        if(flag == 0)
            break;

    }
} 


快速排序

//快速排序
STATUS quickSort(int *p,int low,int high){

    if(low < high){

        int pivot = p[low];
        int l = low;
        int h = high;

        while(l<h){
            while(p[h] > pivot)
                h--;
            p[l] = p[h];
            while(p[l] < pivot)
                l++;
            p[h] = p[l];
        }
        p[l] = pivot; 

        quickSort(p,low,l-1);//左递归
        quickSort(p,l+1,high);//右递归 

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值