我的算法入门——各种排序(未完成)

几大排序方法比较

在这里插入图片描述

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
  • 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
  • 空间复杂度:是指算法在计算机

一、选择排序(Selection Sort)

具体算法:
初始状态:无序区为R[1…n],有序区为空;

第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;

n-1趟结束,数组有序化了。
动图演示:

在这里插入图片描述

  • 第一种(from“正月点灯笼”)
    原理是:
    把找出待排序里的最大值,挪动到最右边,然后待排序数组的长度-1
int findMaxPos(int arr[], int n)
{
   
	int max = arr[0];//假设arr[0]为最大
	int pos = 0;	 //数组的最大值下标
	int i;
	for (i = 0;i < n;i++)
	{
   
		if (arr[i] > max)	//如果发现有更大的数
		{
   
			max = arr[i];	//记录最大值
			pos = i;		//记住该数组的最大值下标
		}
	}
	return pos;
}
void selectionSort(int arr[], int n)
{
   	
	
	
	while (n > 1)
	{
   
		//在arr[]数组里找到最大值的下标
		int pos = findMaxPos(arr, n);	
		//找到之后,与数组最后一位交换(arr[n - 1])
		int temp = arr[pos];
		arr[pos] = arr[n - 1];
		arr[n - 1] = temp;
		n--;		//待排序数组长度-1
	}
}
int main()
{
   
	int arr[] = {
    5,8,9,7,6,1,2,4,3 };
	selectionSort(arr, 9);
	int i;
	for (i = 0;i < 9;i++)
	{
   
		printf("%d\n", arr[i]);
	}
	return 0;
} 					
  • 第二种(from“merely尘埃”)
    找出待排序的数组的最小值,挪动到待排序数组的最左端(k=i代表每组待排序数组开始时候的最左端)
void SelectSort(int a[])    //选择排序
{
   
    int i,j,k,temp;
    int n;                  //代表数组的长度
    for(i = 1;i<=n;i++)     //进行n趟操作
    {
   
        k = i;              //每一组没有排序的组合的开端
        for(j = i;j<=n;j++) //选出[i , n] 中最小的元素,下标为k
            {
                  //选出来的新元素将会比以及排好序的部分都大
                if(a[j] < a[k])
                    k = j;
            }
        temp = a[i];        //交换a[k]与a[i]
        a[i] = a[k];
        a[k] = temp;
    }
}

二、插入排序(Insertion Sort)

动图演示:
在这里插入图片描述

  • 第一种(form“merely尘埃”)
int A[maxn],n;  //n为元素个数

void insertSort()
{
   
    int i,j,k,temp;
    for(i = 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值