選擇排序:每一趟從待排序的
資料元素
中選出最小(或最大)的乙個元素,放在已排好序的數列的最後,直到全部待排序的資料元素排完。
它是一種
不穩定的排序方法。
選擇排序前半部分逐漸有序,每趟是從待排序的資料元素位置開始掃瞄。
典型的選擇排序演算法:
(1) 直接選擇排序
(2) 堆排序
直接選擇排序**:
//簡單選擇排序
bool selectsort1(int a,int n)
for (int i=0;ia[i])
}} return true;
}
上述**中,每次比較發現a[j]>a[i],就交換。可優化為如下的形式:
bool selectsort2(int a,int n)
for (int i=0;ia[k]) //並不需要每次都交換
}if (k!=i)
}return true;
}
直接選擇排序的時間複雜度為o(n^2),同樣是不穩定的。
堆排序:
當然,這是小頂堆,大頂堆則相反。
如果把堆序列所對應的陣列,看作乙個完全二叉樹的順序儲存,那麼,我們可以發現這顆二叉樹滿足如下的性質:
任意分值支節點的值小於等於它左右孩子節點的值,即每乙個分支節點是以它為樹根的樹中的最小者。
小圖為乙個小頂堆和大頂堆
我們可以看到,對於乙個陣列,如果我們用該數組建乙個小頂堆所對應的完全二叉樹,則樹的根節點即為最小值。然後我們刪除根節點,重新建堆,又可找到次小值,依次類推,即可完成排序。
//a[k]陣列元素從小標1開始,並不從0開始
//堆調整
//a的大小為size+1,size為實際待排序的數的個數
void heapadjust(int a,int k,int size)
}bool heapsort(int a,int size)
createheap(a,size); //建立完成後,a[1]為最小值了
for(int i=size;i>1;i--)
return true;
}
上面**中堆的調整使用的是遞迴實現的,現在使用非遞迴實現:
//heapadjust的非遞迴實現
void heapadjust(int a,int k,int size)
else //不需要調整
}a[minindex] = a[k];
}
參考: 經典排序演算法之選擇排序
來自 演算法 中關於選擇排序的描述 首先找到陣列中最小的元素,將它和陣列的第乙個元素交換位置。其次,在剩下的元素中找到最小的元素,將它與陣列的第二個元素交換位置。如此往復,直到整個陣列排序。這就是選擇排序。話不多說,上 片段吧。public static void selectionsort int...
經典演算法之選擇排序
核心就是找到最小 大 的元素,並在剩餘元素中繼續找最小 大 並放有序數列後,重複n次 時間複雜度o n 不是很穩定啊!1.首先在未排序的數列中找到最小 大 的元素放在首位 2.再剩餘元素中繼續挑出乙個最小 大 的元素,放在步驟1所在序列的後面 3.重複 選擇排序,先找到最小 大 的元素 再在剩餘元素...
排序演算法 經典排序演算法之選擇排序
演算法的基本思想,是從無序中選擇最小的元素,然後交換。1 從陣列的第乙個元素開始,將待排序陣列分為有序和無序兩個區間。2 從無序陣列中選取最小的元素和有序陣列的最後乙個元素交換。3 重複第2步,直到無序陣列沒有元素為止。時間複雜度為o n n 空間複雜度為o 1 選擇排序是給每個位置選擇當前元素最小...