排序算法实现

void Swap(int *ap,int *bp)
{
	int tmp=*ap;
	*ap=*bp;
	*bp=tmp;
}//模块化

**

1 选择排序

**
(遍历N-1次,每次找出数组的最小值与前面的数交换实现有序)
在这里插入图片描述

void SelectSort(int *a,int n)
{
// if 与for的结合
	 int temp;
	 for (int i = 0; i <n-1; i++)//每次选出第i小,最后一位不用选,已经是了
	 {
		 int k = i;//k作为最小值下标保存
		 for (int j = i + 1; j < n; j++)//找出每次遍历的最小值
		 {
			

			 if (a[k] > a[j])// k和j比较,找出最小值
			 {
				 k = j;//保证k保存的是此次遍历的最小值
			 }


		 }
	if(k!=i)
		{
			Swap(&a[k],&a[i])
		}	
	 }
	}
	}

ps:在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

**

2 插入排序(扑克牌接牌)

**
(逐步构造出有序,找到造成不有序的值,和前面的值比较,若小于前面的值后移空出位来,直至大于前面的数插入)

void insert_sort(int *a,int n)
{
	int tmp;
	int j;
	for (int i = 1; i < n; i++)//1 有序
	{
		if (a[i] < a[i - 1])
		{
			tmp = a[i];//还要比较前面的数是否小于它,保存插入数
			j = i - 1;
			do//前面判断过i与i-1
			{
				
					a[j+1] = a[j ];//将大于它的值后移,空出位子来让它插入
					j--;
				
			} while (j>=0&&a[j]>tmp);

			a[j+1] = tmp;//此时插入j的位置使得有序
		}
	}
}
    std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1}; 
 
    std::cout << "before sort:      ";
    for (int n: v)
        std::cout << n << ' ';
    std::cout << '\n';
 
    // 插入排序
    for (auto i = v.begin(); i != v.end(); ++i) {
        std::rotate(std::upper_bound(v.begin(), i, *i), i, i+1);
    }
 
    std::cout << "after sort:       ";
    for (int n: v)
        std::cout << n << ' ';
    std::cout << '\n';

3 冒泡

void Bubble_sort()
{
bool tag = true;
for(int i=0;i<n-1;i++) //只有最后一位不用比较
{

	for (int j = 0; j < n-1-i; j++)//每次将最大的值放在最后
	{
		if (a[j] > a[j + 1])//两两比较
		{
			Swap(&a[j],&a[j + 1]);
			tag = false;//是否有序
		}
		
		
	}
	//已经有序不用交换了
	if (tag)
	{
		break;
	}
	
}

}

快排

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值