基本的排序算法(选择、插入、冒泡、希尔、归并、堆、快速)

找工作找不到,学渣写了一天的排序算法,呜呜呜!

先定义个数组,然后写好交换和显示所有元素的函数

int lst[] = {1,4,2,3,4,5,3,4,6,8,7,9,6};

void Swap(int x[],int i,int j){
    int tem = x[i];
    x[i] = x[j];
    x[j] = tem;
}

void print(int x[],int length){
    for(int i = 0; i < length; i++){
        cout << x[i] << "\t";
    }
    cout <<endl;
}
好了,开工,按难度开始吧!

<-----------------------------冒泡排序---------------------------->

void bubbleSort(int r[],int length){
    bool flag = true;
    for(int i = 0; i < length-1 && flag; i++){
        flag = false;
        for(int j = 0; j < length - i-1;j++){
            if(r[j] < r[j+1]) {
                Swap(r,j,j+1);
                flag = true;
            }
        }
    }
}
<-----------------------------选择排序---------------------------->

void selectSort(int r[],int length){
    for(int i = 0; i < length-1; i++){
        int _min = i;
        for(int j = i+1; j < length; j ++){
            if(r[j] < r[_min]) _min = j;
        }
        Swap(r,_min,i);
    }
}
<-----------------------------插入排序---------------------------->
void insertSort(int r[],int length){
    int _trans = 0;
    for(int i = 0; i < length - 1; i++){
        if(r[i] > r[i+1]){
            _trans = r[i+1];
            int k = i;
            while(r[k] > _trans && k >= 0){//这里是为了防止r[k]乱值导致错误k的索引
                r[k+1] = r[k];
                k--;
            }
            r[k+1] = _trans;
        }
    }
}
<-----------------------------希尔排序---------------------------->

void shellSort(int r[],int length){
    int increment = length/2;
    while(increment >= 1){
        for(int i = increment; i < length ; i++){
            int j = i-increment;
            int key = r[i];
            while(j >=0 && r[j] > key){
                    r[j+increment] = r[j];
                    j = j-increment;
            }
            r[j+increment] = key;
        }
        increment = increment/2;
    }
}
<-----------------------------快速排序---------------------------->

int Partition(int r[],int low,int high){
    int value = r[low];
    while(low < high){
        while(low < high && r[high] >= value) high--;
        Swap(r,low,high);
        while(r[low] <= value && low < high) low++;
        Swap(r,low,high);
    }
    return low;
}

void quickSort(int r[],int low, int high){
    int pivot;
    if(low < high){
        pivot = Partition(r,low,high);
        quickSort(r,low,pivot-1);
        quickSort(r,pivot+1,high);
    }

}
<-----------------------------建堆排序---------------------------->

void maxHeapify(int r[],int heapSize,int index){
    int left = 2*index+1;
    int right = 2*index+2;
    int larger = index;
    if(r[larger] < r[left] && left <= heapSize) {//不能有left=heapSize
        larger = left;
    }else larger = index;
    if(r[larger] < r[right] && right <= heapSize){//不能有left=heapSize
        larger = right;
    }
    if(larger!=index){
        Swap(r,larger,index);
        maxHeapify(r,heapSize,larger);
    }
}

int lastNode(int index){
    if(index/2==0) return (index-1)/2;
    else return (index-2)/2;
}

void buildMaxHeap(int r[],int heapSize){
    for(int i = lastNode(heapSize); i >= 0; i --){
        maxHeapify(r,heapSize,i);
    }
}

void heapSort(int r[],int length){
    int heapSize = length;
//    buildMaxHeap(r,length);
    print(r,heapSize);
    for(int i = heapSize - 1; i > 0; i--){
        Swap(r,0,heapSize-1);
        heapSize--;
        print(r,heapSize);
        maxHeapify(r,heapSize,0);

    }
}
<-----------------恭喜大家掌握了基本的排序算法------------------>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值