目录
选择排序
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;
}