1、选择排序流程图:
2、计数排序流程图:
3、简单排序处理流程
(2)如果最小元素不是待排序序列的第一个元素,做伏胡将其和第一个元素互换;
(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。
扩展资料:基本选择排序:
选择排序输出的是原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*
排序算法有很多,包括插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等。插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是利用非比较的其它方法来获得有关输入数组的排序信息。
思想
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。[1]
解释
对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟它的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),
等到循环结束的时候,应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标纯拦,就让第一个元素跟它交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让它厅做跟数组中第二个元素交换一下值,以此类推。
参考资料:
百度百科——选择排序
假设有5个数5,4,3,2,1分别存放于数组a[0],a[1],a[2],a[3],a[4]
第一步以 设基准索引i = 0, 则数a[0]为基准,也就是从a[1..4]中的数进行选择,樱乱裤若比基准小,则和基准做对换,反之则不动,设比较索引j=1开始比较。
j = 1 -->a[0]=5 >a[1]=4 则 a[0] <==>a[1],结果为4,5,3,2,1
j = 2 -->a[0]=4 >a[2]=3 则 a[0] <==>a[2],结果为3,5,4,2,1
j = 3 -->a[0]=3 >a[3]=2 则 a[0] <==>a[3],结果为2,5,4,3,1
j = 4 -->a[0]=2 >a[4]=1 则 a[0] <==>a[4],结果为1,5,4,3,2
由于j已经达到数组末尾则认为i=0即a[0]元素已经排序,而i=0并未达到数组尾部则陪源i=i+1也就是i=2,然后重复上述步骤直到i=4为止。注意j的起始比较索引是随着i变化而变化的,它们的关脊简系是j = i+1
#include<stdio.h>
#define M 5
void main()
{
int b[M],i,j,t,k
for(i=0i<Mi++)
scanf("%d",&b[i])
for(i=0i<M-1i++)
{
for(k=i,j=i+1j<Mj++)
if(b[k]<b[j])
k=j
if(i!=k)
{
t=b[i]
b[i]=b[k]
b[k]=t
}
}
for(i=0i<Mi++)
printf("%d ",b[i])
}
错在大括号位置加错了。
扩展资料:C语言选择排序详解
工作原理是每一次从无序组的数据元素中选出最小(或最大)的一个元素,存放在无序组的起顷好始位置,无序组元素减少,有序组元素增加,直到全部待排序的数据元素排完。
以升仿乎闹序为例的图解:
代码:
#include<stdio.h>
void SelectionSort(int *num,int n)
{
int i = 0
int min = 0
int j = 0
int tmp = 0
for(i = 0i <n-1i++)
{
min = i//每次讲min置成无序组起始位置元素下标
for(j = ij <nj++)//遍历无序组,找到最小元素。
{
if(num[min]>num[j])
{
min = j
}
}
if(min != i)//如果最小元素不是无序组起始位置元素,则与起始元素交换位置
{
tmp = num[min]
num[min] = num[i]
num[i] = tmp
}
}
}
(此处空一行)
int main()
{
int num[6] = {5,4,3,2,9,1}
int i = 0
SelectionSort(num,6)//这里备罩需要将数列元素个数传入。有心者可用sizeof在函数内求得元素个数。
for(i = 0i <6i++)
{
printf("%d ",num[i])
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)