本文目錄一覽:
C語言編程:選擇法排序
選擇排序是一種簡單直觀的排序算法。
工作原理:
每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
性能:
選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。
選擇排序的時間複雜度是O(n^2)
思想:
n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
①初始狀態:無序區為R[1..n],有序區為空。
②第1趟排序
在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
……
③第i趟排序
第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
C語言版代碼:
#include stdio.h
#include math.h
#define MAX_SIZE 101
#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
void sort(int[], int); /* selection sort */
int main()
{
int i, n;
int list[MAX_SIZE];
printf(“Enter the number of numbers to generate: “);
scanf_s(“%d”, n);
if (n 1 || n MAX_SIZE){
fprintf(stderr, “Improper value of n\n”);
exit(1);
}
for (i = 0; i n; i++){ /* randomly generate numbers */
list[i] = rand() * 1000;
printf(“%d “, list[i]);
}
sort(list, n);
printf(“\n Sorted array:\n”);
for (i = 0; i n; i++) /* print out sorted numbers */
printf(“%d “, list[i]);
printf(“\n”);
return 0;
}
void 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語言選擇排序法
這是選擇排序。先用a[0]與a[1]比較,當a[0]a[1]時並不交換,而用k記下來現在a[0]最小……這樣一趟比較完後a[k]就是整個數組中最小的元素,把它與a[0]交換;第二趟,從a[1]開始重複前面的操作,那麼最後a[1]就是剩下的n-1個元素中最小的……看a[0]、a[1]已經由小到大排好了,當做完n-1趟時不就把整個數組都排好了嗎?注意:t=array[k];array[k]=array[i];array[i]=t;不是for(j=i+1;jn;j++)的循環體,要等它循環完了後才執行一次。
C語言 選擇排序
void SelectSort(SSTable L)
{//對順序表L做簡單選擇排序
int i,j,k,n;
SSTable元素類型 t; //不能只交換key,要整個結構進行交換
for(i=0;iL.length-1;i++) //循環範圍變了
{
k=i;
for(j=i+1;j=L.length;j++)
{
if(L.R[j].keyL.R[k].key)
k=j;//k指向此趟排序中最小的記錄
if(k!=i)
{
t=L.R[i];
L.R[i]=L.R[k];
L.R[k]=t;
}
for(n=0;nL.length;n++)
printf(“%d “,L.R[n].key);
printf(“\n”);
}
}
}
c語言選擇排序的程序代碼
選擇排序改進了冒泡排序,每次遍歷列表只做一次交換,為了做到這一點,一個選擇排序在遍歷時尋找最大的值,並在完成遍歷後,將其放到正確的地方。
第二次遍歷,找出下一個最大的值。遍歷n-1次排序n個項,最終項必須在n-1次遍歷之後。
接下來呢,我們直接進行把最小值放到已排序序列末尾的操作。當然這是第一輪循環,還沒有產生已排序的序列。0就是已排序序列的開頭數字了。
第二輪初始化開始,我們繼續選取假設的最小值,這次,我們還是選取第一個數字作為假設的最小值,需要注意的是,0已經是已排序序列,我們要從未排序的序列中選取第一個數字,也就是(5、1、8、6、2、3、4、9、7)無序序列中的數字5。
c語言怎樣通過函數調用實現選擇排序法
c語言通過函數調用實現選擇排序法:
1、寫一個簡單選擇排序法的函數名,包含參數。int SelectSort(int * ListData,int ListLength);
2、寫兩個循環,在循環中應用簡單選擇插入排序:
int SelectSort(int * ListData,int ListLength)
{
int i , j ;
int length = ListLength;
for(i=0;i=length-2;i++)
{
int k = i;
for(j=i+1;j=length-1;j++)
{
if(ListData[k]ListData[j])
{
k=j;
}
}
if(k!=i)
{
int tmp = ListData[i];
ListData[i] = ListData[k];
ListData[k] = tmp;
}
}
return 0;
}
3、對編好的程序進行測試,得出測試結果:
int main()
{
int TestData[5] = {34,15,6,89,67};
int i = 0;
printf(“排序之前的結果\n”);
for(i = 0;i5;i++)
printf(“|%d|”,TestData[i]);
int retData = SelectSort(TestData,5);
printf(“排序之後的結果:\n”);
for(i = 0;i5;i++)
printf(“|%d|”,TestData[i]);
return 0;
}
4、簡單選擇排序中,需要移動的記錄次數比較少,主要的時間消耗在對於數據的比較次數。基本上,在比較的時候,消耗的時間複雜度為:n*n。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/243238.html