Giải thuật
Ý tưởng của thuật toán chọn trực tiếp mô phỏng một trong những cách sắp xếp tự nhiên nhất trong thực tế: chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa phần tử này về vị trí đúng là đầu dãy hiện hành; sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn N-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2; lặp lại quá trình trên cho dãy hiện hành... đến khi dãy hiện hành chỉ còn 1 phần tử. Dãy ban đầu có N phần tử, Vậy tóm tắt ý tưởng thuật toán là thực hiện N-1 lượt việc đưa phần tử nhỏ nhất trong dãy hiện hành về vị trí đúng ở đầu dãy. Các bước tiến hành như sau :
• Bước 1: i = 1;
• Bước 2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[n]
• Bước 3 : Hoán vị a[min] và a[i]
• Bước 4 : Nếu i < n-1 thì i = i+1; Lặp lại Bước 2 ngược lại: thì dừng. //n-1 phần tử đã nằm đúng vị trí. Chương trình: #include<stdio.h> #include<conio.h> #include<time.h> #include<stdlib.h>
void Input(int a[], int n) { int i; for(i=0;i<n;i++) { a[i]=rand()%1000+1; } }
void Swap(int *a,int *b){ int tmp =*a;
*a=*b; *b=tmp; }
void SelectionSort(int a[],int n )
{ int min; // chi so phan tu nho nhat trong day int i,j;
for ( i=0; i<n-1 ; i++) { min = i;
for( j = i+1; j <n ; j++) if (a[j] < a[min])
Nguyễn Văn Nguyên Bài thực hành Tin học Đại cương 31
min = j; // ghi nhan vi tri phan tu nho nhat Swap(&a[min], &a[i]);
} }
void Output(int a[], int n) { int i;
for(int i=0;i<n;i++) printf("%10d",a[i]); }
int main(){ int a[10000]; int n;
clock_t start,end;
printf("nhap so luong phan tu :"); scanf("%d",&n); Input(a,n); start=clock(); SelectionSort(a,n); end=clock(); Output(a,n);
printf("\nXung bat dau: %ld",start); printf("\nXung ket thuc: %ld",end); getch();
}