数据结构之排序算法及升级

目录

选择排序

1.选择排序思路

2.选择排序的逻辑

2.1找出数组中最小的元素

2.2与首元素进行交换

2.3循环

3.细节打磨

升级版本


选择排序

1.选择排序思路

第一组选择排序:

当看见一个数组,使用排序的思路其实就是找到数组中的最小值,然后将其与数组第一个元素进行交换,其目的是将最小值放在最前面。我们称这一个过程为一组排序

如图:

第二组选择排序:

将第一个元素排除形成一个新的数组再一次找到新数组的最小值 ,然后将最小值和新数组第一个元素进行交换

同样的第三组选择排序也是同样的原理进行一组选择排序剔除一个数形成一个新的数组。

图中例子的数组一共有十个元素那么需要进行多少组选择排序?

答案是9次排序。

n个元素的数组选择排序需要n-1组。

2.选择排序的逻辑

  • 找出数组中最小的元素

  • 与首元素进行交换

  • 得到新数组,再次进行到第一步直到新数组只有一个的时候停止

2.1找出数组中最小的元素

int main()
{
    int arr[]={5,3,6,8,1,7,9,4,2,10};
    int minset=0;//初始化最小值下标
    int i=0;
    for(i=0;i<10;i++)//依次作比较
    {
        if(arr[minset]>arr[i])//更新最小值下标
        {
            minset=i;
        }      
    }
    printf("最小值下标:%d\n",minset);
    printf("最小值:%d\n",arr[minset]);
    return 0;
}

2.2与首元素进行交换

我们找到最小值下标minset,就要进行交换把最小的元素放最前面

int main()
{
    int arr[]={5,3,6,8,1,7,9,4,2,10};
    int minset=0;//初始化最小值下标
    int i=0;
    for(i=0;i<10;i++)//依次作比较
    {
        if(arr[minset]>arr[i])//更新最小值下标
        {
            minset=i;
        }      
    }
    int temp=arr[minset];
    arr[minset]=arr[0];
    arr[0]=temp;
    for(i=0;i<10;i++)
    {
       printf("%d ",arr[i]);  
    }  
    return 0;
}

2.3循环

也就是说这一个动作其实就是一组选择排序,只需要在外层加上for循环即可。

#include<stdio.h>
int main()
{
    int arr[] = { 5,3,6,8,1,7,9,4,2,10 };
    int minset = 0;//初始化最小值下标
    int i ,j= 0;
    for (j = 0; j < 10; j++)
    {
        minset = j;//minset是首元素下标
        for (i = j; i < 10; i++)
        {
            if (arr[minset] > arr[i])
            {
                minset = i;
            }
        }
        int temp = arr[minset];
        arr[minset] = arr[j];
        arr[j] = temp;
        for (i = 0; i < 10; i++)
        {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
   // printf("最小值下标:%d\n", minset);
    //printf("最小值:%d\n", arr[minset]);
    return 0;
}

3.细节打磨

  • 10个元素的数组需要进行9组选择排序就能完成

  • minset每次都是数组首元素的下标,那么在找最小值的时候,无需和首元素再做比较

  • 两个数交换经常使用完全可以进行封装

这里给出第一,二点优化程序:其有点外层少一次循环,内层每次也少一次循环。

#include<stdio.h>
void My_swap(int*arr,int j,int minset)
{
    int temp = arr[minset];
        arr[minset] = arr[j];
        arr[j] = temp;
}
int main()
{
    int arr[] = { 5,3,6,8,1,7,9,4,2,10 };
    int minset = 0;//初始化最小值下标
    int i ,j= 0;
    //第一点优化由j<10——>j<9
    for (j = 0; j < 9; j++)
    {
        minset = j;//minset是首元素下标
        //第二点优化由i=j——>i=j+1
        for (i = j+1; i < 10; i++)
        {
            if (arr[minset] > arr[i])
            {
                minset = i;
            }
        }
       /* int temp = arr[minset];
        arr[minset] = arr[j];
        arr[j] = temp;
        *///--->封装起来
        //第三点优化
        My_swap(arr,j,minset);
        
        for (i = 0; i < 10; i++)
        {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
   // printf("最小值下标:%d\n", minset);
    //printf("最小值:%d\n", arr[minset]);
    return 0;
}

升级版本

这个版本找出最小值的同时也找出最大值,这样的话。那么就节约了一大半的功夫

void My_swap(int* arr, int n, int set)
{
    int temp = arr[set];
    arr[set] = arr[n];
    arr[n] = temp;
}
int main()
{
	int arr[] = { 5,3,6,8,1,7,9,4,2,10 };
	int i, j = 0;
	int minset = 0;
	int maxset=0;
	for (j = 0; j < 5; j++)
	{
		minset = j;
		maxset = 9 - j;
		for (i = j+1; i < 10-j; i++)
		{
			minset = (arr[i] > arr[minset]) ? minset : i;
			maxset = (arr[i] > arr[maxset]) ? i : maxset;
		}
		My_swap(arr, j, minset);
		My_swap(arr, 9-j, maxset);

		for (i = 0; i < 10; i++)
		{
			printf("%d ", arr[i]);
		}
		printf("\n");
	}
	/*
	printf("  %d %d\n ", minset, arr[minset]);
	printf(" %d %d\n ", maxset, arr[maxset]);
	*/
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值