排序算法总结

(1)冒泡排序:每次循环选出最小的放到前面,进行交换。

for(int i=0;i<size;i++){
        for(int j=i+1;j<size;j++){
            if(data[i]<data[j]){
                gu.SwapTowData(data[i],data[j]);
            }
        }
    }

(2)选择排序:每次从剩下的元素中选择一个最小的,但是不交换,只记录位置最后在交换。

for (int i = 0; i <size; i++)
    {
        int index = i;
        int min = data[i];
        for(int j=i+1;j<size;j++){
            if(data[j] > min){
                index = j;
                min = data[j];
            }
        }
        if(index != i)
            gu.SwapTowData(data[i],data[index]);
    }

(3)插入排序:将元素向已经排序好的数据中插入。即:每次交换大小位置不同的元素。

for(int i=1;i<num;i++){
        for(int j=0;j<i;j++){
            if(data[j]<data[i]){
                gu.SwapTowData(data[i],data[j]);
            }
        }
    }

(4)快速排序:选出一个基元素,将大于基元素放右边,小于的放左边,进行挖坑交换,每次选一个大的,然后选一个小的,到指针在同一个位置,将基元素房进去。

void SortProcess(T* &data, int start, int end){
    int base = data[start];
    int pos = start;
    int i = start + 1;
    int j = end;
    while(i<j){
        for (; j > i; j--)
        {
            if(base<data[j]){
                data[pos] = data[j];
                pos = j;
                break;
            }
        }
        for (;i<j; i++)
        {
            if(base>data[i]){
                data[pos] = data[i];
                pos = i;
                break;
            }
        }
    }
    data[pos] = base;
}

void Sort(T* &data, int start, int end){

    if(data == NULL || end <= start || end <0 || start < 0)return ;
    int middle = (end-start)/2;

    SortProcess(data,start,end);
    Sort(data,start,start+middle);
    Sort(data,start+middle+1,end);
}

(5)归并排序:合并两个有序的数字序列,将需要的排序的数据进行不停的划分,指导仅剩一个元素后,不停的合并相邻的两个序列。
(6)堆排序:堆用数组表示,(i-1)/2为父节点,2i+1和2i+2为左右孩子;在建立好堆之后,堆排序的过程就是每次取出堆的顶点,之后调整堆,执行删除操作。
堆的建立操作,每次将数据防止在数组最后,然后比较其和父节点的大小,满足条件,则终止,否则交换后,继续比较交换后父节点的大小关系,直到满足条件终止;
堆的删除操作:每次删除跟节点,方法是将数组最后一个元素,放置到根位置,比较其同孩子的关系,不满足交换,继续考虑交换后同孩子的关系,直到满足条件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值