冒泡、插入、堆排序、归并整理

#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1001;
int n,s[maxn],heap[maxn];

void downAdjust(int low,int high)
{
    int i = low,j = i*2;
    while(j<=high)
    {
        if(j+1 <= high && heap[j] < heap[j+1])
            swap(heap[j],heap[j+1]);
        if(heap[j] > heap[i])
        {
            swap(heap[j],heap[i]);
            i = j;
            j = i*2;
        }
        else
            break;
    }
}

void creatHeap()
{
    for(int i = n/2;i>0;i--)
    {
        downAdjust(i,n);
    }
}

void heapSort()
{
    creatHeap();
    for(int i = n;i>0;i--)
    {
        swap(heap[1],heap[i]);
        downAdjust(1,i-1);
    }

}

void bubbleSort()
{
    for(int j = n - 1;j>0;j--)
    {
        int flag = 0;
        for(int i = 0;i<j;i++)
        {
            if(s[i]>s[i+1])
            {
                swap(s[i],s[i+1]);
                flag = 1;
            }
        }
        if(flag == 0) break;
    }

}

void inserSort()
{
    int j;
    for(int i = 1;i<n;i++)
    {
        int temp = s[i];
        for(j = i;j>0 && s[j-1] > temp;j--)
        {
            s[j] = s[j-1];
        }
        s[j] = temp;

    }
}

void mergeN(int a[],int l1,int r1,int l2,int r2)
{
    int i = l1,j=l2;
    int temp[maxn],ind = 1;
    while(i <= r1 && j <= r2)
    {
        if(a[i] > a[j])
            temp[ind++] = a[j++];
        else
            temp[ind++] = a[i++];
    }
    while(i <= r1) temp[ind++] = a[i++];
    while(j <= r2) temp[ind++] = a[j++];
    for(int k = 1;k<ind;k++)
    {
        a[l1 + k - 1] = temp[k];
    }
}

void mergesort(int l,int r,int a[])
{
    if(l < r)
    {
        int mid = (l + r)/ 2;
        mergesort(l,mid,a);
        mergesort(mid+1,r,a);
        mergeN(a,l,mid,mid+1,r);
    }
}

void Merge() //归并简单实现
{
    vector<int>temp;
    temp = origin;
    int flag = 0 ;
    for(int i = 2;i / 2< n;i*=2)
    {
        for(int j = 0;j<n;j+=i)
        {
            sort(temp.begin()+j,temp.begin()+min(j+i,n));
        }
    }
}



int main()
{
    freopen("1.txt","r",stdin);
    scanf("%d",&n);
    for(int i = 1;i<=n;i++)
        scanf("%d",&heap[i]);
//    inserSort();
//    bubbleSort();
//    heapSort();
    mergesort(1,n,heap);
    for(int i = 1;i<=n;i++)
        printf("%d",heap[i]);


    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C语言实现各种排序方法的代码示例: 1. 冒泡排序 ``` c void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 选择排序 ``` c void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min_index]) { min_index = j; } } int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] = temp; } } ``` 3. 插入排序 ``` c void insertion_sort(int arr[], int n) { for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ``` 4. 希尔排序 ``` c void shell_sort(int arr[], int n) { for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) { arr[j] = arr[j - gap]; } arr[j] = temp; } } } ``` 5. 快速排序 ``` c void quick_sort(int arr[], int left, int right) { if (left < right) { int pivot = partition(arr, left, right); quick_sort(arr, left, pivot - 1); quick_sort(arr, pivot + 1, right); } } int partition(int arr[], int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp; return i + 1; } ``` 6. 归并排序 ``` c void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; merge_sort(arr, left, mid); merge_sort(arr, mid + 1, right); merge(arr, left, mid, right); } } void merge(int arr[], int left, int mid, int right) { int i = left, j = mid + 1, k = 0; int temp[right - left + 1]; while (i <= mid && j <= right) { if (arr[i] < arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int m = left, n = 0; m <= right; m++, n++) { arr[m] = temp[n]; } } ``` 7. 堆排序 ``` c void heap_sort(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } for (int i = n - 1; i > 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } } void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) { largest = left; } if (right < n && arr[right] > arr[largest]) { largest = right; } if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } ``` 8. 计数排序 ``` c void counting_sort(int arr[], int n) { int max = arr[0], min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int count[max - min + 1]; memset(count, 0, sizeof(count)); for (int i = 0; i < n; i++) { count[arr[i] - min]++; } for (int i = 1; i < max - min + 1; i++) { count[i] += count[i - 1]; } int temp[n]; for (int i = n - 1; i >= 0; i--) { temp[--count[arr[i] - min]] = arr[i]; } for (int i = 0; i < n; i++) { arr[i] = temp[i]; } } ``` 9. 桶排序 ``` c void bucket_sort(int arr[], int n) { int max = arr[0], min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } int bucket_num = (max - min) / n + 1; int bucket[bucket_num][n]; int bucket_count[bucket_num]; memset(bucket_count, 0, sizeof(bucket_count)); for (int i = 0; i < n; i++) { int index = (arr[i] - min) / n; bucket[index][bucket_count[index]] = arr[i]; bucket_count[index]++; } int k = 0; for (int i = 0; i < bucket_num; i++) { if (bucket_count[i] > 0) { insertion_sort(bucket[i], bucket_count[i]); for (int j = 0; j < bucket_count[i]; j++) { arr[k++] = bucket[i][j]; } } } } ``` 10. 基数排序 ``` c void radix_sort(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } } for (int exp = 1; max / exp > 0; exp *= 10) { counting_sort_by_digit(arr, n, exp); } } void counting_sort_by_digit(int arr[], int n, int exp) { int count[10]; memset(count, 0, sizeof(count)); for (int i = 0; i < n; i++) { count[(arr[i] / exp) % 10]++; } for (int i = 1; i < 10; i++) { count[i] += count[i - 1]; } int temp[n]; for (int i = n - 1; i >= 0; i--) { temp[--count[(arr[i] / exp) % 10]] = arr[i]; } for (int i = 0; i < n; i++) { arr[i] = temp[i]; } } ``` 以上是C语言实现各种排序方法的代码示例,可以根据具体的需求进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值