9.排序_

9.排序

插入排序算法:直接插入排序、折半查找排序、希尔排序
交换排序算法:冒泡排序、快速排序
选择排序算法:简单选择排序、堆排序
归并排序算法:
基数排序算法:
各算法性能对比:

直接插入排序

基本思想:从下标为1的元素(38)开始,依次同前面的元素比较,若小于前元素,便交换位置
在这里插入图片描述
部分示例:
在这里插入图片描述

直接插入排序(不带哨兵).

void InsertSort(int A[],int n){
    int i,j;
    // 遍历整个数组
    for(i=1; i<=n; i++){
        if(A[i] < A[i-1]){
            // 将A[i]暂存到temp
            temp = A[i];
            // 依次往前遍历当前指向元素前的子表
            for(j=i-1; j>=0 && temp < A[j]; --j){
                // 将所有A[j]元素往后移一位
                A[j+1] = A[j];
            }
            A[j+1] = temp;
        }
    }
}

直接插入排序(带哨兵).

void InsertSort(int A[], int n);{
    int i,j;
    // 插入排序外层遍历
    for (i = 2; i <= n; i++){ 
        // 找合适的插入位置
        if(A[i] < A[i-1]){
            // 将A[i]暂存到哨兵
            A[0] = A[i]
            // 从后往前遍历找到第一个小于等于A[i]的元素下标
            for(j = i-1; A[0] < A[j]; --j){
                A[j+1] = A[j];
            }
            // 将A[0]插入到第一个小于等于A[i]元素的后一位
            A[j+1] = A[0];
        }
    }
}

算法性能:

时间复杂度: 最好情况:O(n) ; 最坏情况:O(n²) ;平均情况:O(n²)
空间复杂度:O(1)
稳定性:稳定

希尔排序

基本思想: 将待排序表分成若干"特殊"子表,对每个子表分别进行直接插入排序,慢慢缩小增量d,重复过程,直到d=1为止。
部分示例:
d=4,每隔4个元素将其合成子表,在子表中进行直接插入排序
在这里插入图片描述
d=d/2,下一次d=2
部分示例:
在这里插入图片描述

相关代码.

void ShellSort(ElemType A[],int n){
    // d表示增量
    // d1=n/2,di+1=[di/2],直到最后一个增量为1
    for(int d=n/2; d>=1; d=d/2){
        // 依次遍历每个子表 
        for(int i=d+1; i<=n; ++i){
       		// 如果前面有序子表最后一位(A[i-d])比当前需要调整位置的(A[i])key大
       		// 则需要找到A[i]应该插入的位置
            if(A[i] < A[i-d]){
                // 将元素暂存到A[0]
                // 将A[i]插入到应该插入的位置(类似前面直接插入排序找插入位置)
                A[0] = A[i];
                for(j = j-d; j > 0 && A[0]  <A[j]; j-=d){
                    A[j+d] = A[j];
                }
                A[j+d] = 0;
            }
        }
    }
}

算法性能:

时间复杂度: 最好情况:O(n) ; 最坏情况:O(n²) ;平均情况:O(n的1.3次方)
空间复杂度:O(1)
稳定性:不稳定

总结表格:
在这里插入图片描述

void Sort_CollegeScore(AllCollege *as) //按学院总分排序(直接插入排序) { int i,j,k; printf("\t|----------------------------------------------------------------|\n"); printf("\t|---- 学院编号\t|学院名字 |男团体总分|女团体总分|总分 |----|\n"); printf("\t|----------------------------------------------------------------|\n"); for (i = 2;i<as->College_num;i++) { as->College[0].boys_score = as->College[i].boys_score; as->College[0].girl_score = as->College[i].girl_score; as->College[0].shool_score = as->College[i].shool_score; as->College[0].College = as->College[i].College; strcpy(as->College[0].College_name,as->College[i].College_name); j = i - 1; while (as->College[0].shool_score < as->College[j].shool_score && j >0) { as->College[j+1].boys_score = as->College[j].boys_score; as->College[j+1].girl_score = as->College[j].girl_score; as->College[j+1].shool_score = as->College[j].shool_score; as->College[j+1].College = as->College[j].College; strcpy(as->College[j+1].College_name,as->College[j].College_name); j--; } as->College[j+1].boys_score = as->College[0].boys_score; as->College[j+1].girl_score = as->College[0].girl_score; as->College[j+1].shool_score = as->College[0].shool_score; as->College[j+1].College = as->College[0].College; strcpy(as->College[j+1].College_name,as->College[0].College_name); } for (k = 2;k<=as->College_num;k++) { printf("\t|---- %-9d|%-8s |%-4d\t|%-10d|%-8d|----|\n",as->College[k].College,as->College[k].College_name,as->College[k].boys_score,as->College[k].girl_score,as->College[k].shool_score); printf("\t|----------------------------------------------------------------|\n"); } printf("\n\n");system("pause"); }
06-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值