❶ c語言選擇排序法
外面的for循環,依次從隊列中取出一個數用來比較
裡面的for循環,用來比較上面選擇的數據與後面的每個數據。
❷ c語言選擇排序是怎麼實現的 思路是什麼
在要排序的一組數中,選出最小(或者最大)的一個數與第1個位置的數交換;然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後一個數)比較為止。
簡單選擇排序的示例:
❸ c語言中 順序表的選擇排序是什麼
選擇排序(Selection sort)是一種簡單直觀的排序演算法。工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
以下是一個實現選擇排序的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
//將list中的n個數據,通過選擇排序演算法排序。
void selete_sort(int list[], int n)
{
int i, j, min, temp;
for (i = 0; i < n - 1; i++){
min = i;
for (j = i + 1; j < n; j++)//找出最小元素的下標。
if (list[j] < list[min])
min = j;
SWAP(list[i], list[min], temp);//交換最小元素到當前起始位置。
❹ C語言數組選擇排序法,超簡單,求解
for語句有4個部分內容for ( A;B;C ) D;其中A是初始化語句,每個for只執行A一次,B是循環條件,每次循環前執行判斷,如果不滿足則結束循環,D是在滿足循環條件時執行的,可以是一句或多句(多句時用大括弧括起來做整體處理),C是在執行D之後進行的後續處理。for語句執行的順序是:A,B,D,C,B,D,C,B,D,C,...,B結束
for(i=0;i<9;i++){
iTemp=a[i];iPos=i;
for(j=i+1;j<10;j++){
if(a[j]<iTemp){iTemp=a[j];iPos=i;}
}
a[iPos]=a[i];a[i]=iTemp;
}
假設數組a中輸入了十個數為:1,2,5,4,6,8,7,9,10,3,通過手動單步執行程序(把自己當成計算機),分析理解for語句的含義。
i=0;[i=0],i<9成立,開始循環
iTemp=a[i];[iTemp=a[0]=1],iPos=i;[iPos=0]
j=i+1;[j=0+1=1],j<10成立,開始循環:a[j]<iTemp不成立[a[j]=a[1]=2,2<1不成立],跳過不執行
j++;[j=2],j<10成立,繼續循環:a[j]<iTemp不成立[5<1],跳過不執行
j++;[j=3],j<10成立,繼續循環:a[j]<iTemp不成立[4<1],跳過不執行
j++;[j=4],j<10成立,繼續循環:a[j]<iTemp不成立[6<1],跳過不執行
...//沒有條件滿足讓if語句條件能得到執行,因為a[1]~a[9]都不小於iTemp
j++;[j=10],j<10不成立,結束循環
a[0]=a[0];a[0]=1;實際上a[0]值未變,通過以上處理a[0]保存a[0]之後所有數組中最小值
i++;[i=1],i<9成立,繼續循環
iTemp=a[i];[iTemp=a[1]=2],iPos=i;[iPos=1]
j=i+1;[j=2],j<10成立,開始循環:a[j]<iTemp不成立[5<2],跳過不執行
j++;[j=3],j<10成立,繼續循環:a[j]<iTemp不成立[4<2],跳過不執行
...//沒有條件滿足讓if語句條件能得到執行,因為a[2]~a[9]都不小於iTemp
j++;[j=10],j<10不成立,結束循環
a[1]=a[1];a[1]=2;實際上a[1]值未變,通過以上處理a[1]保存a[1]之後所有數組中最小值
i++;[i=2],i<9成立,繼續循環
iTemp=a[i];[iTemp=a[2]=5],iPos=i;[iPos=2]
j=i+1;[j=3],j<10成立,開始循環:a[j]<iTemp成立,iTemp=a[j];[iTemp=4],iPos=j;[iPos=3]
j++;[j=4],j<10成立,繼續循環:a[j]<iTemp不成立[6<4],跳過不執行
...
j++;[j=9],j<10成立,繼續循環:a[j]<iTemp成立,,iTemp=a[j];[iTemp=3],iPos=j;[iPos=9]
j++;[j=10],j<10不成立,結束循環
a[9]=a[2];a[2]=3;通過以上處理a[2]與a[2]之後所有數組中最小值的a[9]值互換
現在數組變成:1,2,3,4,6,8,7,9,10,5
...//每次i循環都會導致當前a[i]與之後最小值的元素互換值,結果是a[i]保存之後最小值
i++;[i=9],i<9不成立,結束循環
至此數組按照從小到大順序排序
上述循環中,i值指定當前要處理的元素,j值負責每次提供之後所有元素下標,在進行比較後,當前i指向元素會與之後最小值進行交換,保證當前元素是之後元素中最小的,從而進行9次這樣的處理後數組按順序已經排好序了。
❺ c語言選擇排序法
輸出中的
for(i=0;i<10;i++)
應該改為
for(i=0;i<5;i++)
為了好看
printf("%d",a[i])
改為
printf("%d ",a[i])
吧
❻ C語言使用指針實現選擇法排序。
#include<stdio.h>
voidprint_result(float*,int);
voidSelect_Sort(float*,int);
intmain()
{
inti;
floatarray[10];
float*pointer;
printf("請輸入10個數:\n");
for(i=0;i<10;i++)
{
scanf("%f",&array[i]);
}
pointer=array;
Select_Sort(pointer,10);
print_result(pointer,10);
return0;
}
voidprint_result(float*p,intn)
{//輸出結果
intk;
for(k=0;k<n;k++)
{
printf("%g\t",*(p+k));
}
}
voidSelect_Sort(float*pt,intn)
{//全用指針的選擇排序法
inti,j,k;
floattempnum;
for(i=0;i<n;i++){
k=i;
for(j=i+1;j<n;j++)
{
if(*(pt+j)>*(pt+i))
{
k=j;
}
}
tempnum=*(pt+i);
*(pt+i)=*(pt+k);
*(pt+k)=tempnum;
}
}
(6)c語言選擇排序擴展閱讀:
其它方法:
voidSelectSort(intarr[],intn)
{
printf("\n選擇排序法過程:\n");
inti,j,k,l,t;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(arr[j]<arr[k])
{
k=j;
}
}
if(k!=i)
{
t=arr[i];arr[i]=arr[k];arr[k]=t;
}
for(l=0;l<n;l++)
{
printf("%3c",arr[l]);
}
printf("\n");
}
}
❼ 有關c語言選擇排序的問題。
#include <stdio.h>
int main()
{
int a[10];
int i,j,k,t;
for(i=0;i<=9;i++) {scanf("%d",&a[i]);}
for(j=0;j<10;j++)
{
k=j;
for(i=j+1;i<10;i++) if(a[k]>a[i]) k=i;
t=a[k]; a[k]=a[j]; a[j]=t;
}
for(i=0;i<=9;i++)
{printf("%d ",a[i]);}
return 0;
}
j就是大循環,循環結束排序就完成。
i是小循環,這個循環用來查找 未排序的數據中的最小的數據位置,
找到後,和當前位置交換數據。
❽ C語言選擇排序法
人家的效率高,交換次數少。比如3、2、1三個數。
你是第一輪3和2換變成2、3、1,再2和1換,變成1、3、2,第二輪3和2換變成1、2、3
他的是第一輪從後面選一個比3小的最小的數,K保存這個數的下標,先k是1,再k是2,一輪循環玩了才3和1交換,變成1、2、3,第二輪不交換。
你的演算法沒輪交換次數不定,看數據,他的每輪最多交換一次,特別是數據多時用他的效率高很多,因為給K賦值比交換快很多
❾ C語言選擇法排序
#include<stdio.h>
#defineM 5
void main()
{
int b[M],i,j,t,k;
for(i=0;i<M;i++)
scanf("%d",&b[i]);
for(i=0;i<M-1;i++)
{
for(k=i,j=i+1;j<M;j++)
if(b[k]<b[j])
k=j;
if(i!=k)
{
t=b[i];
b[i]=b[k];
b[k]=t;
}
}
for(i=0;i<M;i++)
printf("%d ",b[i]);
}
錯在大括弧位置加錯了。
代碼:
#include<stdio.h>
void SelectionSort(int *num,int n)
{
int i = 0;
int min = 0;
int j = 0;
int tmp = 0;
for(i = 0;i < n-1;i++)
{
min = i;//每次講min置成無序組起始位置元素下標
for(j = i;j < n;j++)//遍歷無序組,找到最小元素。
{
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 = 0;i < 6;i++)
{
printf("%d ",num[i]);
}
return 0;
}
❿ c語言——選擇排序
遞歸版
#include<stdlib.h>
#include<stdio.h>
#define arrSize 1000
void RecurSelectSort(int a[], int n, int i);
main()
{
int a[arrSize], i, n;
printf("Please input the number of integers:"); /* 列印提示信息 */
scanf("%d", &n); /* 讀取字元串長度 */
printf("Please input the integers:"); /* 列印提示信息 */
/* 讀取數組元素 */
for(i=0;i<n;i=i+1){
scanf("%d", &a[i]);
}
/* 進行升序函數調用 */
for(i=0;i<n;i=i+1){
RecurSelectSort(a, n, i);
}
/* 列印數組元素 */
for(i=0;i<n;i=i+1){
printf("%d ", a[i]);
}
printf("\n"); /* 換行 */
system("pause");
}
void RecurSelectSort(int a[], int n, int i)
{
int b, max;
if(n==1){
if(a[n-1]>a[n]){
max=a[n-1];
a[n-1]=a[n];
a[n]=max;
}
}
else{
if(a[n-2]>a[n-1] && n>2){
b=a[n-1];
a[n-1]=a[n-2];
a[n-2]=b;
}
RecurSelectSort(a, n-1, i);
i=0;
}
}