十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
void selectionsort(int a[],int m)
我们提供的服务有:成都网站设计、网站制作、微信公众号开发、网站优化、网站认证、江口ssl等。为成百上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的江口网站制作公司
{
int i,j;
int k;
int tmp;
for(i = 0; i m-1; i++)//控制循环次数,n个数需要n-1次循环
{
k = i;
for(j = i+1; j m ; j++)
{
if(a[j] a[k])
k = j;
}
//i不等于k是就证明a[i]不是最小的,
//i等于k时证明a[i]就是本轮比较过程中最小的值
if(i != k)
{
tmp = a[i];
a[i] = a[k];
a[k] = tmp;
}
}
}
首先这是一种快速排序的算法,你也应该知道,快速排序就是选择序列中的一个元素作为基准,通过循环找到这个基准最终的位置,并把所有小于这个基准的元素移到这个位置的左边,大于基本的元素移到右边,这样再对这个基准的左右两边分别递归调用自己,最终就能得到排序的结果。
再来解释一下这个例子,它选择的基准就是v[(left+right)/2],然后将这个基准雨v[left]交换,现在假设你想从头排序到最后,则你会将left传个0,也就是他将这个基准和V[0]交换了,这个时候开始循环,因为第一个元素是基准,所以从第二个元素开始循环(也就是left+1),然后到if判断部分,如果v[i]v[left],也就是说这个时候已经至少有一个元素比基准小了,所以基准至少在v[1]或者之后了,所以他把你找到的这个比基准小的v[i]和v[++last]交换,这时候v[i]的位置已经是在基准的正确位置或者之前了,不会在基准之后的,所以这就实现了把比基准小的元素移到基准的正确位置之前,你说的【第一遍执行过程中,第8行last=left=0,那么到了11行时相当于交换v[1]和v[0+1]】这没有错,确实是在自己交换自己,但是这样并不违背前面的思路不是么?当if条件不满足的时候,last是不会增加的,但是i会一直加1,所以last和i就会不同,这只是在将比基准小的元素移到基准之前,每有一个比基准小的,last就加1,这样当你循环一遍之后的last值就是基准应该在的位置,而且这个时候,所有比基本小的元素也都在last之前了,这时候last位置的元素也是比基准小的,这没关系,因为之后还有一句swap[v,last,left],到目前位置,基准的位置找到了,基准左边的元素都比基准小,右边都比基准大,再对基准的左右两边递归调用自己,就完成了序列的排序。
c语言通过函数调用实现选择排序法:
1、写一个简单选择排序法的函数名,包含参数。int SelectSort(int * ListData,int ListLength);
2、写两个循环,在循环中应用简单选择插入排序:
int SelectSort(int * ListData,int ListLength)
{
int i , j ;
int length = ListLength;
for(i=0;i=length-2;i++)
{
int k = i;
for(j=i+1;j=length-1;j++)
{
if(ListData[k]ListData[j])
{
k=j;
}
}
if(k!=i)
{
int tmp = ListData[i];
ListData[i] = ListData[k];
ListData[k] = tmp;
}
}
return 0;
}
3、对编好的程序进行测试,得出测试结果:
int main()
{
int TestData[5] = {34,15,6,89,67};
int i = 0;
printf("排序之前的结果\n");
for(i = 0;i5;i++)
printf("|%d|",TestData[i]);
int retData = SelectSort(TestData,5);
printf("排序之后的结果:\n");
for(i = 0;i5;i++)
printf("|%d|",TestData[i]);
return 0;
}
4、简单选择排序中,需要移动的记录次数比较少,主要的时间消耗在对于数据的比较次数。基本上,在比较的时候,消耗的时间复杂度为:n*n。
/*
排序前:
One-1 Two-2 Three-3 Four-4 Five-5 Six-6 Seven-7 Eight-8 Nine-9 Ten-10
排序后:
Two-2 Three-3 Ten-10 Six-6 Seven-7 One-1 Nine-9 Four-4 Five-5 Eight-8
Press any key to continue
*/
#include stdio.h
#include string.h
void sort(char *a[],int n) { // 选择排序
char *temp;
int i,j,k;
for(i = 0;i n - 1;i++) {
k = i;
for(j = i + 1;j n;j++)
if(strcmp(a[k],a[j]) 0) k = j;
if(k != i) { // 交换的是字符串的地址,不是字符串的内容
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
int main() {
int i,n = 10;
char *s[] = {"One-1","Two-2","Three-3","Four-4","Five-5","Six-6","Seven-7","Eight-8","Nine-9","Ten-10"};
printf("排序前:\n");
for(i = 0;i n;i++) printf("%s ",s[i]);
printf("\n\n");
sort(s,n);
printf("排序后:\n");
for(i = 0;i n;i++) printf("%s ",s[i]);
printf("\n\n");
return 0;
}
#define N 26
#include stdio.h
void fun(char str[]);
int main(){
int i,j;
char str[N];
for (i=0;iN;i++)
scanf("%c",str[i]);
fun(str);
for (i=0;iN;i++)//输出也要加循环
printf("%c ",str[i]);
}
void fun(char str[]){
char min;
int i,j,mark;
for(i=0;iN;i++) {
min=str[i];
mark=i;
for(j=i;jN;j++)
if (minstr[j]){
min = str[j];
mark=j;
}
min=str[i];
str[i]=str[mark];
str[mark]=min;
}
}
那个函数就是fun()函数。。。