面試經典演算法3之選擇排序

2021-06-18 07:22:05 字數 1456 閱讀 8858

選擇排序:每一趟從待排序的

資料元素

中選出最小(或最大)的乙個元素,放在已排好序的數列的最後,直到全部待排序的資料元素排完。

它是一種

不穩定的排序方法。

選擇排序前半部分逐漸有序,每趟是從待排序的資料元素位置開始掃瞄。

典型的選擇排序演算法:

(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 選擇排序是給每個位置選擇當前元素最小...