ACM七大排序模板

One.最牛逼的归并排序

#include <iostream>
using namespace std;
/*功能:将两个有序的数组合并成一个整体有序的数组*/
void mergeArr(int arr[], int low, int mid, int hight)
{
    int* tempArr = new int[hight - low + 1];
    int i = low, j = mid + 1, k = 0;
    while (i <= mid && j <= hight)
     {
        if (arr[i] < arr[j])
        {
            tempArr[k] = arr[i];
            i++;
        }
        else
        {
            tempArr[k] = arr[j];
            j++;
        }
        k++;
    }
    // 如果 arr[low] 到 arr[mid] 区间中的数组还没有比较完成 ,直接复制到tempArr 中
    while (i <= mid)
    {
        tempArr[k] = arr[i];
        i++;
        k++;
    }
    // 如果 arr[mid+1] 到 arr[hight] 区间中的数组还没有比较完成 ,直接复制到tempArr 中
    while (j <= hight)
    {
        tempArr[k] = arr[j];
        j++;
        k++;
    }
    // 比较完成之后 将原本的数组arr 下标 low-hight 对应的内容 进行改变
    i = low;
    for (int tempK = 0;((tempK < k)&&(i<=hight));tempK++)
    {
        arr[i] = tempArr[tempK];
        i++;
    }
    delete[] tempArr;
    tempArr = NULL;
}

/**
 *功能:拆分有序的序列两两排序-拆解结束的条件 子序列长度为1的时候
 */
void sortArr(int arr[], int low, int hight)
{
    if (low < hight)
    {
        int mid = (hight + low) / 2;
        sortArr(arr,low,mid);// 递归拆解左边的序列
        sortArr(arr, mid + 1, hight);// 递归拆解左边的序列
        mergeArr(arr, low, mid, hight);// 将两个有序的子序列(arr[low至mid]、arr[mid+1至hight] 排序合并成一个新的有序列
    }
}
int main()
{
    long long m;
    int arr[2000000]={0};
    cin >>m;
    for (long long j = 0;j < m;j++)
    {
        cin>>arr[j];
    }
    sortArr(arr,0,m);
    for (int j = 1;j <=m;j++)
    {
        cout << arr[j] << " ";
    }
    return 0;
}

Two.利用库函数STL快速排序SORT

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[10];
	for(int i=0;i<10;i++)
	{
		cin>>a[i];
	}
	sort(a,a+10);
	for(int i=0;i<10;i++)
	{
		cout<<a[i];
	}
	return 0;
}

Three.桶排序

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,x;
    cin>>n;
    int sum(0),b[1002];
    memset(b,0,sizeof(b));
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        if(b[x])
            continue;
        b[x]++;
        sum++;
    }
    cout<<sum<<endl;
    for(int i=1;i<=1000;i++)
        if(b[i])
            cout<<i<<' ';
    cout<<endl;
    return 0;
}

Four.冒泡排序

时间复杂度最大,最简单的排序

void bubblesort(int *arr,int n)
{
	for (int i = 0; i < n; 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;
			}
		}
	}
}

Five.插入排序

// 直接插入排序
void insertSort(ElemType array[], int n){
    cout << endl << "Direct insertion sort (from small to large)" << endl;
    int count_sort = 0, count_move = 0;
    int i, j, temp;
    for(i = 1; i < n; i++){
        temp = array[i];
        for(j = i - 1; temp < array[j]; j--){
            array[j + 1] = array[j];    // 所有符合规定元素后移
            count_move ++;
            count_sort ++;
            if(j == -1){
                break;  // 防止越界
            }
        }
        array[j + 1] = temp;    // 插入位置插入当前元素
    }
    printMatrix(array, n);	// 打印数组
    cout << "Number of data comparisons: " << count_sort << endl;
    cout << "Number of data moves: " << count_move << endl;
}

Six.快速排序

//把值进行交换
void swap(int *x,int *y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
} 
 
//把数组分成两部分
int partition(int *a,int left ,int right)
{
	int j = left;  //用来遍历数组 
	int i = j-1;  //用来指向小于基准元素的位置
	int key = a[right]; //基准元素
	//快速排序的思想,从前往后找大于基准元素的放到右边
	for (; j < right; ++j)
	{
		if(a[j] <= key)
			swap(&a[j], &a[++i]);
	}
	//把基准元素放到中间
	swap(&a[right], &a[++i]);
	//返回数组中间的位置
	return i;
}
 
//快速排序的函数
void quicksort(int *a,int left ,int right)
{
	if(left >= right)
		return;
	int mid = partition(a,left,right);
	quicksort(a,left,mid-1);
	quicksort(a,mid+1,right);
}

Seven.选择排序

void selectsort(int *a ,int n)
{
	for (int i = 0; i < n; i++)
	{
		int key = i;  //临时变量用来存储最小的变量
		for (int j = i+1; j < n; j++)
		{
			if(a[j]<a[key])
				key =j; //交换,找到最小的数值
		}
	    if(key !=i)
	    {
			int temp = a[key];
			a[key] = a[i];
			a[i] =temp;
	    }
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值