/選擇排序法對數組中的n個數,由小到大排序
#include<stdio.h>
main()
{
int n=10,i,b,a[10];
int sort(int array[],int n);
// scanf("%d",&10);
for(i=0;i<10;i++)//鍵盤輸入數組元素
scanf("%d",&a[i]);
sort(a,10);//調用函數
for(i=0;i<10;i++)//輸出排序之后的函數
printf("%3d",a[i]);
}
//排序子函數錯誤!!!!這是冒泡的思想!!!
//int sort(int array[],int n)//排序子函數
{
int i,j,k,t;
for(i=0;i<n-1;i++)//需要比較n-1次
{
//k=i;
for(j=i+1;j<n;j++)//第i次比較,與第i+1個數開始比較
{
if(array[j]<array[i])
{
t=array[i];
array[i]=array[j];
array[j]=t;
}
}
}
}
//下面是正確的子函數
int sort(int array[],int n)//排序函數
{
int i,j,k,t;
for(i=0;i<n-1;i++)//需要比較n-1次
{
k=i;
for(j=i+1;j<n;j++)//第i次比較,與第i+1個數開始比較
if(array[j]<array[k])
k=j;//for(j)函數到這里結束了!!!!
t=array[i];
array[i]=array[k];
array[k]=t;
}
}
//冒泡排序法對數組中的n個數,由小到大排序 #include<stdio.h> main() { int sort(int array[],int n); int n=10,i,j,k,a[10]; printf("請輸入10個數:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); sort (a,10); printf("輸出排序后的10個數:\n"); for(i=0;i<10;i++) printf("%2d",a[i]); } int sort(int array[],int n) { int i,j,k; for (j=0;j<9;j++) { for(i=0;i<9-j;i++) { if(array[i]>array[i+1]) { k=array[i]; array[i]=array[i+1]; array[i+1]=k; } } } }
選擇法:
假定a[0]為最值,先將10個數中最小的數與a[0]對換,(只有這倆對換,其余位置不變!!!)再將a[1]~a[9]中最小的數與a[1]對換......每比較一輪,找出未經排序的最小的數。以5個數為例子說明:
a[0] a[1] a[2] a[3] a[4]
2 5 0 8 3
[0] 5 [2] 8 3 將5個數中最小的與a[0]對換
0 [2] [5] 8 3 將余下的4個數中最小的與a[1]對換
0 2 [3] 8 [5] 將余下的3個數中最小的與a[2]對換
0 2 3 [5] [8] 將余下的2個數中最小的與a[3]對換
完成排序
選擇排序法的復雜度:O(n*n)
冒泡排序法:
臨近數字兩兩依次比較,按從小到大或從大到小順序交換,一趟過去之后,最大或最小的數字被交換到了最后一位。再從頭開始比較,直到倒數第二位。
以5個數為例子說明:
a[0] a[1] a[2] a[3] a[4]
2 5 0 8 3
第一趟:第一次兩兩比較: 2 0 5 8 3
第一次兩兩比較: 2 0 5 3 [ 8 ]
第二趟: 0 2 3 [ 5 8 ]
第三趟: 0 2 [ 3 5 8 ]
第四趟: 0 [ 2 3 5 8 ]
完成排序。
冒泡排序法的復雜度:O(n*n)。
兩者都是效率比較低的排序方法。
我最開始把選擇和冒泡搞混了,選擇的思想在於每次只有最值和第i個數對換,其余都保持原位不變!!!所以子函數里面,for循環里面的小for循環,只是把j賦給k,繼續小for循環 ,不交換a[j]和a[k]的值。到外面的大for循環再交換a[j]和a[k]的值,這樣就實現了選擇排序。