简单的排序算法

排序算法有十大经典算法,随便网上一搜都是一堆,1.冒泡排序、2.选择排序、3.插入排序、4.希尔排序、5.归并排序、6.快速排序、7.堆排序、8.计数排序、9.桶排序、10.基数排序。

在这里就把前三种复习一下,假设都是递增排序。

 

冒泡排序:从前到后不断比较相邻元素,如果后面元素比前面元素小,就交换(第二层for循环)。前面的操作一共操作size次(第一层for循环)。关于冒泡排序还有一个特别的地方,它不改变相同元素的相对位置。

//冒泡,一直比较相邻元素,不改变顺序:
for (i = 0; i < size - 1; i++) {// i表示排序次数
    for (j = 0; j < size - i - 1; j++) {
        if (arr[j] > arr[j+1]) {// 交换
            tmp = arr[j];  
            arr[j] = arr[j+1];  
            arr[j+1] = tmp; 
        }
    }
}

 

选择排序:从剩余元素中挑选最小的一个(第二层for循环)。把最小的元素和当前元素交换,然后继续向下一个元素扫描(第一层for循环):

//选择:从剩余元素中选择最小的替换
for (i = 0; i < size - 1; i++) {
    k = i;
    for (j = i + 1; j < size; j++)
        if (arr[j] < arr[k])  k = j;
    tmp = arr[k];
    arr[k] = arr[i];
    arr[i] = tmp;
}

 

插入排序:轮询数组,如果当前元素比上一元素大(第一层for循环),就把它插入到前面元素的合适位置上(第二层for循环):

//插入:当前元素不是有序的就放入到前面合适位置
for (i = 1; i < size; i++) {    
    if (arr[i] < arr[i-1]) {    
        tmp = arr[i];    
        for (j = i - 1; j >= 0 && arr[j] > tmp; j--) {  
            arr[j+1] = arr[j];    
        }  
        arr[j+1] = tmp;    
    }          
} 

 

写个简短程序跑一下,看下效果:

// 冒泡
void BubbleSort(int *arr, int size) {
    int i, j, tmp;
    printf("0-BubbleSort:\n");
    //冒泡,一直比较相邻元素,不改变顺序:
    for (i = 0; i < size - 1; i++) {// i表示排序次数
        for (j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j+1]) {// 交换
                tmp = arr[j];  
                arr[j] = arr[j+1];  
                arr[j+1] = tmp; 
            }
        }
    }
}

// 选择
void SelectionSort(int *arr, int size) {
    int i, j, k, tmp;
    printf("1-SelectionSort:\n");
    //选择:从剩余元素中选择最小的替换
    for (i = 0; i < size - 1; i++) {
        k = i;
        for (j = i + 1; j < size; j++) // 从剩余元素中选择最小的
            if (arr[j] < arr[k])  k = j;
        tmp = arr[k];
        arr[k] = arr[i];
        arr[i] = tmp;
    }
}

// 插入
void InsertionSort(int *arr, int size){
    int i, j, tmp;
    printf("2-InsertionSort:\n");
    //插入:当前元素不是有序的就放入到前面合适位置
    for (i = 1; i < size; i++) {    
        if (arr[i] < arr[i-1]) {    
            tmp = arr[i];    
            for (j = i - 1; j >= 0 && arr[j] > tmp; j--) {  
                arr[j+1] = arr[j];    
            }  
            arr[j+1] = tmp;    
        }          
    }
}

int main(){
    int arrInt[10] = {3,5,4,2,6,1,9,7,10,8};
    int i;
    
    scanf("%d", &i);
    
    switch(i) {
        case 0:
            BubbleSort(arrInt, 10);
            break;
        case 1:
            SelectionSort(arrInt, 10);
            break;
        case 2:
            InsertionSort(arrInt, 10);
            break;
    }
    
    for (i = 0; i < 10; i++) {
        printf("%d ", arrInt[i]);
    }
    
    while (1) {}  // 保持程序不结束,方便查看打印结果
    return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值