十大经典排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序、计数排序、桶排序和基数排序)的原理、代码实现和应用经验。

1.冒泡排序

用了两种方式一个是双重循环,另一个是递归。我的错误是第二个递归没有设置递归出口所以一直报溢出错误。希望你们做的时候要了解。还有就是应该是可以优化这个算法,比如加一个标记,你们可以试一试博主就先不加了。

//双重循环

void bubblesort1(int* arr, int n)
{
    for (int i = 0; i < n - 1; i++)//一共进行n-1排序
    {
        for (int j = 0; j < n - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int p = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = p;
            }
        }
    }
}

//递归算法
void bubblesort2(int* arr, int n)
{
    if (n == 0)       //递归的出口
    {
        return;
    }
    for (int i = 0; i < n - 1; i++)
    {
        if (arr[i] > arr[i + 1])
        {
            int tmp = arr[i + 1];
            arr[i + 1] = arr[i];
            arr[i] = tmp;
        }
    }
    bubblesort2(arr,n-1);

}

int main()
{
    int arr[11] = { 29,45,67,53,12,3,4,2,56,78,33 };
    int n = sizeof(arr) / sizeof(arr[0]);
    bubblesort2(arr, n);
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << endl;
    }
    return 0;
}

 2.选择排序

void SelectSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)//需要遍历的长度
	{
		for (int j = i + 1; j < n; j++)//每次遍历比较具体的数字
		{
			if (a[i] > a[j])
			{
				int tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
	}
}
//递归方法
void SelectSort2(int* a, int n)
{
	if (n < 2)return;//递归出口
	for (int i = 0; i < n; i++)
	{
		int tmp  =0;
		for (int i = 0; i < n; i++)
		{
			if (a[i]<a[tmp]) 
			{
				tmp = i;
			}
		}
		if (tmp != 0)
		{
			int tmp1 = a[tmp];
			a[tmp] = a[0];
			a[0] = tmp1;
		}
	}
	SelectSort2(a + 1, n - 1);//每次传入数组后一个位置
}
int main()
{
	
	int a[10] = { 2,3,56,76,34,23,14,16,76 };
	int n = sizeof(a) / sizeof(a[0]);
	cout << "排序前的数组:";
	for (int i = 0; i < n-1; i++) {
		cout << " " << a[i] ;
	}
	cout << endl;
	SelectSort(a, n);
	cout << "循环排序后的数组:";
	for (int i = 0; i < n - 1; i++) {
		cout << " " << a[i];
	}
	cout << endl;
	SelectSort2(a, n);
	cout << "递归排序后的数组:";
	for (int i = 0; i < n - 1; i++) {
		cout << " " << a[i];
	}
	
	return 0;
}

3.插入排序

void InsertSort(int* a, int n)
{
	int i, key, j;
	for (i = 1; i < n; i++)//外层循环
	{
		int key = a[i];
		int j = i - 1;
		while (j >= 0 && a[j] > key)
		{
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = key;
	}
}

4.快速排序

快速排序通过多次比较与交换来完成排序。而这个过程又被分为了多次重复单趟排序,接下来我们先从每一趟的排序讲起。

快速排序的单趟排序思想是:

在一个无序数组中取一个数pivot,每一趟排序的最终目的是:让pivot的左边的所有数小于pivot,pivot的右边都大于pivot(假设排升序)。

我用的是while循环,

以下是代码:

void qsort(int a[], int L, int R)
{
	if (L >= R)
		return;
	int left = L, right = R;
	int pivot = a[left];
	while (left < right)
	{
		while (left < right && a[right] >= pivot)//如果最右边的值大于pivot
		{
			right--;//向右移动
		}
		if (left < right)
		{
			a[left] = a[right];//把右边的值赋给左边
		}
		while (left < right && a[left] <= pivot)
		{
			left++;
		}
		if (left < right)
		{
			a[right] = a[left];
		}
		if (left >= right)
		{
			a[left] = pivot;
		}
	}
	qsort(a, L, right - 1);
	qsort(a, right + 1, R);
}

这个是例题:

 

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<iostream>
using namespace std;
void qsort(int a[], int L, int R)
{
	if (L >= R)
		return;
	int left = L, right = R;
	int pivot = a[left];
	while (left < right)
	{
		while (left < right && a[right] >= pivot)//如果最右边的值大于pivot
		{
			right--;//向右移动
		}
		if (left < right)
		{
			a[left] = a[right];//把右边的值赋给左边
		}
		while (left < right && a[left] <= pivot)
		{
			left++;
		}
		if (left < right)
		{
			a[right] = a[left];
		}
		if (left >= right)
		{
			a[left] = pivot;
		}
	}
	qsort(a, L, right - 1);
	qsort(a, right + 1, R);
}
int main()
{
	int n, k;
	cin >> n >> k;
	int* a = new int[n+1];
	for (int i = 0; i < n; i++)
		cin >> a[i];
	qsort(a, 0, n);
	
	
	cout <<a[k];
	

	return 0;
}

 总结:我这个好像不太好,还需要优化.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值