选择排序

来源:互联网 发布:kali linux双系统安装 编辑:程序博客网 时间:2024/06/05 03:23
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个的新无序区。

这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

#include <stdio.h>#define NUM 9main(){    int i,num[NUM] = {3,6,1,4,2,9,7,5,8};    for(i=0;i<NUM;i++)    {        printf("%d",num[i]);    }    printf("\n");    paixufa(num);          for(i=0;i<NUM;i++)    {        printf("%d",num[i]);    }}int paixufa(int num[]){    int i,j,k,t;    for(i=0;i<NUM-1;i++)    {        k=i;        for(j=i+1;j<NUM;j++)        {            if(num[i]>num[j])            {                k=j;                t = num[i];                num[i] = num[j];                num[j] = t;            }        }    }}


另一种方式

#include <stdio.h>#define N 8main(){    int i,arr[N] = {3,6,5,2,1,4,8,7};    for(i=0;i<N;i++)    {        printf("%d  ",arr[i]);    }        printf("\n");    paixu(arr);      for(i=0;i<N;i++)    {        printf("%d",arr[i]);    }}    paixu (int arr[]){    int i , j , k,temp;      for(i=0;i<N;i++)    {        k= i ;          for(j=i+1;j<N;j++)        {            if(arr[j]>arr[k])            {                    k=j;//如果元素J的值大于K 赋值 那么下面的K肯定不等于i然后交换 大的值就在前面了            }        }        if(k!=i)        {            temp = arr[i];            arr[i] = arr[k];            arr[k] = temp;        }    }}


刚把指针学完了,现在用指针的方法实现选择排序

#include <stdio.h>#define NUM 5main(){    int arr[NUM]={2,5,3,4,8};    int * p =arr;    change(p);     int i;    for(i=0;i<NUM;i++)    {            printf("%d",arr[i]);    } } change(int *a){    int temp,i,j;    for(i=0;i<NUM;i++)    {        for(j=i+1;j<NUM;j++)        {            if(*(a+i)<*(a+j))            {                temp = *(a+j);                *(a+j) = *(a+i);                *(a+i) = temp;            }        }    } }


原创粉丝点击