冒泡、选择、插入、希尔、归并、快速排序

在这里插入图片描述

不稳定的排序:快(快排)些(希尔)选(选择)一堆(堆排)

下面是冒泡、选择、插入、希尔、归并、快速排序和测试用例的创建的代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

//测试框架
int* createRandArray(int n){
    int* arr = (int*)malloc(n*sizeof(int));
    srand(time(NULL));
    for(int i=0;i<n;++i){
        arr[i] = rand()%100+1;
    }
    return arr;
}
// 打印数组
void printArray(int* arr,int n){
    for(int i=0;i<n;++i){
        printf("%d ",arr[i]);
    }
    printf("\n");
}
// 判度数组是否是非递减排序
bool isOrder(int* arr,int n){
    for(int i=1;i<n;++i){
        if(arr[i]>=arr[i-1]){
            continue;
        }else{
            return false;
        }
    }
    return true;
}
//===========================================冒泡排序=======================================================
void bubble_sort(int* arr,int n){
    if(n<1) return;
    for(int i = 0;i <n;i++){//每冒泡一次,下次需要冒泡排序的数组长度减1
        for(int j = 0;j<n-i-1;j++){//交换的是倒数第二个和倒数第二个+1个(倒数第一个)
            if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]);
        }
    }
}
//===========================================选择排序=======================================================
//找出最大的元素,放在最后一位
int find_max_element_index(int* arr,int n){
    int max_index = 0;
    int max_element = 0;
    for(int i = 0;i<n;i++){
        if(arr[i]>max_element) {
            max_element = arr[i];
            max_index = i;
        }
    }
    return max_index;
}
void select_sort(int* arr,int n){
    if(n<1) return;
    int max_element_index = 0;
    for(int i = n;i>1;i--){
        max_element_index = find_max_element_index(arr,i);
        swap(arr[max_element_index],arr[i-1]);//注意,是第i-1个而不是第i个
    }
}
//===========================================插入排序=======================================================
//不停地拿元素去插入已经排序好的数组
/*
void insert(int* arr,int n){
    for(int i = n-1;i>0;i--){
        if(arr[i]<arr[i-1]){
            swap(arr[i],arr[i-1]);
        }
    }
}
void insert_sort(int* arr,int n){
    for(int i = 2; i <=n;i++){
        insert(arr,i);
    }
}
*/
void insert_sort(int* arr,int n){
    for(int i = 2; i <=n;i++){
        for(int j = i-1;j>0;j--){
            if(arr[j]<arr[j-1]){
                swap(arr[j],arr[j-1]);
            }
        }
    }
}
//===========================================归并排序=======================================================
void merge_arr(int* arr,int mid,int n){
    int tmp[n];
    int p = 0;// 前半部分下标
    int q = mid;// 后半部分下标
    int k = 0;// 结果下标
    while(p<mid&&q<n){
        if(arr[p]<arr[q]){
            tmp[k++]=arr[p++];
        }else{
            tmp[k++] =arr[q++]; 
        }
    }
    while(p<mid) tmp[k++]=arr[p++];
    while(q<n) tmp[k++] =arr[q++]; 
    for(int i = 0;i<n;i++){
        arr[i]=tmp[i];
    }
}
void merge_sort(int* arr,int n){
    if(n<2) return;
    int mid = n/2;
    merge_sort(arr,mid);
    merge_sort(arr+mid,n-mid);
    merge_arr(arr,mid,n);
}
//===========================================快速排序=======================================================
int position(int* arr,int n){
    int posit = arr[0];
    int i = 0;
    int j = n-1;
    while(i<j){
        while(i<j && arr[j]>=posit) --j;
        while(i<j && arr[i]<=posit) ++i;
        if(i<j) swap(arr[i],arr[j]);
    }
    swap(arr[i],arr[0]);
    return i;
}
void quick_sort(int* arr,int n){
    if(n<2) return;
    int pos = position(arr,n);
    quick_sort(arr,pos);
    quick_sort(arr+pos+1,n-pos-1);
}
//===========================================希尔排序=======================================================
void shell_sort(int arr[],int n){
    int gap = n;
    do{
        gap = gap/2;
        for(int i=gap;i<=n;++i){ //插入排序的初始数据数到结束
            for(int j=i-1;j>=0;j-=gap){ //插入排序
                if(arr[j]<arr[j-gap]){
                    swap(*(arr+j),*(arr+j-gap));
                }else{
                    break;
                }
            }
        }
    }while(gap>1);
}
//=========================================================================================================
int main(){
    int n;
	cin >> n;
	int * arr = createRandArray(n);
	printArray(arr,n);
    //bubble_sort(arr,n);
    //select_sort(arr,n);
    //insert_sort(arr,n);
    //merge_sort(arr,n);
    shell_sort(arr,n);
    //sort(arr,arr+n);//STL
    //quick_sort(arr,n);
	printArray(arr,n);
	cout << isOrder(arr,n) << endl;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值