排序算法笔记

简单插入排序

选当前数作为要插入的数据,从后往前看是否有比当前还小的, 如果有就进行交换 最后将当前数放入要插入的位置

void insert_sort(int* data , int length){
    int i;
    for(int i = 1 ; i < length - 1; i++){
        int index = data[i];  //哨兵  暂存数据    
        int j;
        for(j = i ; j > 0 && index < data[j-1] ; j--){
            data[j] = data[j-1];
        }
        if(j != i){   // 要插入的数据比前面小  否则没有进行交换直接进入下一次循环
            data[j] = index;
        }
    }
}

选择排序

每次拿当前数作为最小值  , 往后遍历 , 找到比最小值还小的数 , 更新下标 , 最后和当前数进行交换

void select_sort(int *data , int length){
    int i;
    for(int i = 0 ; i < length - 1; i++){
        int min = i;    // 默认当前为最小
        int j;
        for(j = i+1 ; j < length ; j++){   //遍历找到最小的下标
            if(data[j] < data[min])
                min = j;    // 更新最小下标
        }
        if(i != min){    // 如果找到比当前还小就交换
            int temp = data[i];
            data[i] = data[min];
            data[min] = temp;
        }
    }
}

希尔排序:

1. 分组

2. 遍历每个组

3. 组内进行插入排序

// 希尔排序
int shell_sort(int *data , int length){
	int gap = 0; // 分组的跨度
	int j , i;
	for(gap = length/2 ; gap >= 1 ; gap/=2){ //分组的次数
		for(i = gap ; i < length ; i++){  //每次分组之后对组进行遍历
			int temp = data[i];
			for(j = i - gap ; j >= 0&&temp < data[j] ; j = j - gap){//组内循环
					data[j+gap] = data[j];	
			}
			data[j+gap] = temp;
		}
	}
	return 0;
}

快速排序

int sort(int *data , int left , int right){
    if(left > right) return 0;
    int i = left;
    int j = right;
    int key = data[left];  // 哨兵
    while(i < j){
        while(i < j && key < data[j]) j--;   //从又往左找比哨兵小的数
        data[i] = data[j];                    //交换
        while(i < j && key > data[i]) i++;    //从左找比哨兵大的数
        data[j] = data[i];                    // 交换
    }
    // i == j
    data[i] = key;                           // 哨兵归位
    // 递归
    sort(data , left , i - 1);
    sort(data , i + 1 , right);
}

int quick_sort(int *data , int length){
    sort(data , 0 , length - 1);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值