【資料結構】【排序】選擇排序(直接選擇排序、堆排序)
阿新 • • 發佈:2018-11-28
【資料結構】【排序】選擇排序
①簡單選擇排序
每次從序列中找出最大/最小元素,插入已排列部分的最後。
過程:
1、設一個變數min,先放在第一個元素的位置,設i,j,i=0,j=i+1。
2、在未排序陣列中找到最小的賦給min,與i比較,開始交換
3、i++ j++
程式碼展示:
//簡單選擇排序 #include<stdio.h> void SimpleSelectSort(int arr[],int len) { int tmp=0; int i=0; int j=i+1; int min=i; for(i;i<len-1;i++) { min=i; for(j=i+1;j<len;j++) { if(arr[j]<arr[min]) { min=j; } } if(min!=i) { tmp=arr[min]; arr[min]=arr[i]; arr[i]=tmp; } } } void Print(int arr[],int len) { for(int i=0;i<len;i++) { printf("%d ",arr[i]); } } int main() { int arr[]={1,3,2,4,3,6,8,7,9}; int len=sizeof(arr)/sizeof(arr[0]); SimpleSelectSort(arr,len); Print(arr,len); }
②堆排序
過程:
1、調出大頂堆
從最後一個非葉子節點開始,從下往上調整,比較兩個葉子大小,再和父節點比較,取較大的交換。
2、交換頂和最後一個節點,取下最後一個節點,再繼續調出大頂堆
程式碼展示:
//堆排序 #include<stdio.h> //調整大頂堆 void AdjustHeap(int arr[],int pos,int len) { int i=pos; int j=2*i+1; int tmp=0; for(j;j<len;j=2*i+1) { if(j<len-1&&arr[j+1]>arr[j]) ++j; if(arr[i]>=arr[j]) break; tmp=arr[i]; arr[i]=arr[j]; arr[j]=tmp; i=j;//結束條件 } } //調大頂堆,交換頂和最後一個,再調整 void HeapSort(int arr[],int len) { int tmp=0; int i; for(i=len/2-1;i>=0;i--)//i最後一個非葉子結點 { AdjustHeap(arr,i,len);//調大頂堆 } for(i=len-1;i>0;i--) { tmp=arr[0]; arr[0]=arr[i]; arr[i]=tmp; AdjustHeap(arr,0,i); } } void Print(int arr[],int len) { for(int i=0;i<len;i++) { printf("%d ",arr[i]); } } int main() { int arr[]={1,3,2,4,3,6,8,7,9}; int len=sizeof(arr)/sizeof(arr[0]); HeapSort(arr,len); Print(arr,len); }
執行結果: