001 C/C++ 選擇排序法


簡單選擇排序:

選擇排序法 是對 定位比較交換法(也就是冒泡排序法) 的一種改進。

選擇排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。

簡單選擇排序的基本思想:第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;以此類推,第i趟在待排序記錄r[i]~r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。

以下為簡單選擇排序的存儲狀態,其中大括號內為無序區,大括號外為有序序列:
初始序列:{49 27 65 97 76 12 38}
  第1趟:12與49交換:12{27 65 97 76 49 38}
  第2趟:27不動 :12 27{65 97 76 49 38}
  第3趟:65與38交換:12 27 38{97 76 49 65}
  第4趟:97與49交換:12 27 38 49{76 97 65}
  第5趟:76與65交換:12 27 38 49 65{97 76}
  第6趟:97與76交換:12 27 38 49 65 76 97 完成

C  code:

 1 void SelectSort( int a[], int length )
 2 {
 3     //對數組a排序,length是數組元素數量
 4     for( int i = 0; i < length; i++ ) {
 5         // 找到從i開始到最后一個元素中最小的元素,k存儲最小元素的下標.
 6         int k = i;
 7         for( int j = i + 1; j < length; j++ ) {
 8             if( a[j] < a[k] ) { k = j; }
 9         }
10 
11         // 將最小的元素a[k] 和 開始的元素a[i] 交換數據.
12         if( k != i ) {
13             int temp;
14             temp= a[k];
15             a[k] = a[i];
16             a[i] = temp;
17         }
18     }
19 }

 選擇排序演示程序:

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 
 4 void printArray( int* a, int length )
 5 {
 6     for( int i = 0; i < length; i++ )
 7     {
 8         printf( "%d ", a[i] );
 9     }
10     printf( "\n" );
11 }
12 
13 void SelectSort( int a[], int length )
14 {
15     //對數組a排序,length是數組元素數量
16     for( int i = 0; i < length; i++ ) {
17         // 找到從i開始到最后一個元素中最小的元素,k存儲最小元素的下標.
18         int k = i;
19         for( int j = i + 1; j < length; j++ ) {
20             if( a[j] < a[k] ) { k = j; }
21         }
22 
23         // 將最小的元素a[k] 和 開始的元素a[i] 交換數據.
24         if( k != i ) {
25             int temp;
26             temp= a[k];
27             a[k] = a[i];
28             a[i] = temp;
29         }
30     }
31 }
32 
33 void main()
34 {
35     int a[]={ 1,56,8,66,2,57,49,26,68,99,100 };
36     int length=sizeof( a ) / sizeof( a[0] );
37     printf( "排序前:" );
38     printArray( a, length );
39     SelectSort( a, length );
40     printf( "排序后:" );
41     printArray( a, length );
42     system( "pause" );
43 }

 Output Result:

排序前:1 56 8 66 2 57 49 26 68 99 100
排序后:1 2 8 26 49 56 57 66 68 99 100
請按任意鍵繼續. . .

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM