数据结构与算法-排序

交换排序

  • 冒泡排序
void bubble_sort(int num[], int n) {
    bool flag;
    for (int i = 0; i < n-1; i++) {
        for (int j = n-1; j > i; j--) {
            flag = true;
            if (num[j-1] > num[j]) {
                swap(num[j-1], num[j]);
                flag = false;
            }
            if (flag) {
                break;
            }
        }
    }
}
  • 快速排序
int position(int num[], int left, right) {
    int temp = num[left];
    while (left < right) {
        while (left < right && num[right] >= temp) {
            right--;
        }
        num[left] = num[right];
        while (left < right && num[left] <= temp) {
            left++;
        }
        num[right] = num[left];
    }
    num[left] = temp;
}
void quick_sort(int num[], int left, int right) {
    if (left < right) {
        int pos = position(num, left, right);
        quick_sort(num, left, pos-1);
        quick_sort(num, pos+1, right);
    }
}
https://blog.youkuaiyun.com/jlqCloud/article/details/46939703

插入排序

  • 直接插入排序
void insert_sort(int num[], int n) {
    int temp;
    for (int i = 1; i < n; i++) {
        if (num[i-1] > num[i]) {
            temp = num[i];
            int j;
            for (j = i-1; j >= 0 && num[j] > temp; j--) {
                num[j+1] = num[j];
            }
            num[j+1] = temp;
        }
    }
}
  • 折半插入排序
void half_insert_sort(int num[], int n) {
    int temp, low, high, mid;
    for (int i = 1; i < n; i++) {
        if (num[i-1] > num[i]) {
            temp = num[i];
            low = 0; high = i-1;
            while (low <= high) {
                mid = (low+high)/2;
                if (num[mid] > temp) {
                    high = mid-1;
                } else {
                    low = mid+1;
                }
            }
            int j;
            for (j = i-1; j >= high+1; j--) {
                num[j+1] = num[j];
            }
            num[high+1] = temp;
        }
    }
}
  • 希尔排序
void shell_sort(int num[], int n) {
    for (int d = n/2; d >= 1; d /= 2) {
        for (int i = d; i <n; i++) {
            int inserted = num[i];
            if (num[i-d] > inserted) {
                int j;
                for (j = i-d; j >=0 && num[j] > inserted; j -= d) {
                    num[j+d] = num[j];
                }
                num[j+d] = inserted;
            }
        }
    }
}

选择排序

  • 简单选择排序
void select_sort(int num[100], int n) {
    int minn;
    for (int i = 0; i < n-1; i++) {
        minn = i;
        for (int j = i+1; j < n; j++) {
            if (num[minn] > num[j]) {
                minn = j;
            }
        }
        if (minn != i) {
            swap(num[minn], num[i]);
        }
    }
}
  • 堆排序
void heapAdjust(int num[100], int start, int end) {
    int child;
    while (start*2+1 <= end) {
        child = start*2+1;
        if (child+1 <= end && num[child] < num[child+1]) {
            child++;
        }
        if (num[start] < num[child]) {
            swap(num[start], num[child]);
        } else {
            break;
        }
        start = child;
    }
}
void heapSort(int num[100], int n) {
    // 先将堆调整为大根堆
    for (int i = n/2-1; i >= 0; i--) {
        heapAdjust(num, i, n-1);
    }
    for (int i = n-1; i > 0; i--) {
        swap(num[0], num[i]);
        heapAdjust(num, 0, i-1);
    }
}

合并排序

int* b = new int[N];
void merge(int a[], int begin, int mid, int end)
{
    int i = begin, j = mid+1, k = begin;
    while(i <= mid && j <= end)
    {
        if(a[i] < a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    while(i <= mid) b[k++] = a[i++];
    while(j <= end) b[k++] = a[j++];
    for(i = begin; i <= end; i++)
        a[i] = b[i];
}
void mergeSort(int a[], int begin, int end)
{
    if(begin < end)
    {
        mergeSort(a, begin, (begin+end)/2);
        mergeSort(a, (begin+end)/2+1, end);
        merge(a, begin, (begin+end)/2, end);
    }
}

计数排序

void count_sort(int num[], int n, int res[]) {
    int minn = num[0], maxx = num[0];
    // 找出数组中最大值和最小值
    for (int i = 1; i < n; i++) {
        if (minn > num[i]) {
            minn = num[i];
        }
        if (maxx < num[i]) {
            maxx = num[i];
        }
    }
    // 计算一共需要多少计数空间
    int d = maxx - minn;
    int* countArray = new int[d + 1];
    // 计数
    for (int i = 0; i < d+1; i++) {
        countArray[i] = 0;
    }
    for (int i = 0; i < n; i++) {
        countArray[num[i] - minn]++;
    }
    // 累加,数组中的值为对应的元素在结果排列中的位置
    for (int i = 1; i < n; i++) {
        countArray[i] += countArray[i-1];
    }
    for (int i = n-1; i >= 0; i--) {
        res[countArray[num[i]-minn]-1] = num[i];
        countArray[num[i]-minn]--;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值