1. 程式人生 > 其它 >C語言中關於選擇法的一些問題

C語言中關於選擇法的一些問題

技術標籤:演算法c++

選擇法是C語言中關於陣列元素處理的一種重要方法,利用選擇法我們可以從陣列中篩選出最大最小項,可以對陣列元素進行重排序。對陣列元素的處理是在之後處理結構體內資料的一個基礎。

篩選最大項:
思路是假定第k個數組元素是最大的,利用for迴圈讓所有陣列元素與它依次比較,如果出現第i個數組元素比它大,那麼替換為第i個元素繼續比較。程式碼如下:

#include "stdio.h"
int main()
{   int i,k;
    int a[10]={0,7,3,4,8,2,5,9,1};
    for(i=0;i<9;i++)
    printf
("[%d] ",i); printf("\n"); for(i=0;i<9;i++) printf(" %d ",a[i]);//輸出原始陣列相應元素 k=1;//假定第k個數組元素是最大的 for(i=2;i<9;i++) if(a[k]<a[i])k=i; //判斷第i個數組元素是否比它大,如果是,那麼更換為第i個數組元素繼續比較 printf("\n\nthe index of maximum is %d",k); return
0; }

執行結果如下
在這裡插入圖片描述

選擇法排序
思路與上一問題類似,差異在於要求每一個數組元素位置都排好序並輸出,而非只找出一項。
程式碼如下:

#include "stdio.h"
int main()
{   int i,j,k,m;
    int a[10]={0,7,3,4,8,2,5,9,1};
    printf("the original array is\n");
    for(i=1;i<9;i++)
    printf("[%d] ",i);
    printf("\n");
    for
(i=1;i<9;i++) printf(" %d ",a[i]);//輸出初始值 for(i=1;i<8;i++)//位置迴圈,目的是讓之後的操作歷經陣列的每個位置 { k=i; for(j=i+1;j<9;j++)//每個位置應該安放什麼數,進行完一整個迴圈就意味著一個位置的元素被確定下來 if(a[k]<a[j])k=j;//如果第j個元素比第k個元素值大,那麼第j個元素和第k個元素交換位置 m=a[i];a[i]=a[k];a[k]=m; } printf("\n \nthe array after sorted is\n"); for(i=1;i<9;i++) printf(" %d ",a[i]);//輸出排序後的陣列 return 0; }

執行結果如下:
在這裡插入圖片描述
選擇法對姓名排序
這是對上一個問題的進一步應用,主要是加入了“string.h”庫來對字串進行處理
程式碼如下:

#include <stdio.h>
#include <string.h>
int main()
{   int i,j,k,m;
    char name[4][15]={"HuaCheng","XieLian","WeiWuxian","LanWangji"};
    char b[15];
    printf("the original names are\n");
    for(i=0;i<4;i++)
    puts(name[i]);
    printf("\n");//輸出原始值 
    for(i=0;i<4;i++)//讓每個陣列位置遍歷之後的操作 
    {
        k=i;
        for(j=i+1;j<4;j++)
        {    if(strcmp(name[k],name[j])>0)k=j;//依靠strcmp函式來對第k個名字和第j個名字的字母依次用ASCII碼比較,從而判定哪個名字在前 
        strcpy(b,name[i]);
        strcpy(name[i],name[k]);
        strcpy(name[k],b);//這樣排序是依strcmp函式判定的名字由大到小排序的 
        } 
    }
    printf("\n \nthe names after sorted are\n");
    for(i=0;i<4;i++)
    printf(" %s  ",name[i]);//輸出結果 
    
    return 0;
}

執行結果如下:
在這裡插入圖片描述

這是一些有關陣列處理的問題,主要用到的方法就是選擇法,在這一思路上還有很多拓展問題,這一思路在陣列處理問題中也是非常常見的。