三 選擇類排序
基本思想:從待排數列中選出最小的記錄,放到已排好序的元素之後,直至所有元素排序完畢!
1. 直接選擇排序
初始時:有序區為空,無序區即待排數列
第一趟,從無序區中選出最小的,與無序區的第乙個元素交換。新的有序區多乙個元素,新的無序區少乙個元素,有序區在無序區之前!
第二趟,......
#define swap(a, b) \
do while(0)
void select_sort(int a, int len)
if (i != minindex)
swap(a[i], a[minindex]);
}
}
直接選擇排序是不穩定的,如
時間複雜度為:o(n^2); 如:第i趟選出最小的元素需要進行n - i 次比較。總的比較次數為:n * (n - 1) / 2, 平均時間複雜度為o(n^2)
2. 堆排序
大根堆:根節點的值比其左右孩子的值大的二叉樹。
在堆排序中並沒有用這種樹形結構儲存資料(二叉樹本身的儲存方式就有「陣列,即線性表「方式),只是借用根節點與左右孩子的關係! 即此堆是由待排數列推出來的!
leftchild = i *2; rightchild = i * 2 + 1; (i = 1, 2, 3,....), 且能推出最大的非葉子節點的編號是 size / 2;
堆排序有兩個問題需要解決:
a> 如何建堆! //待排數列本身就是乙個「二叉樹」, 把它調整成堆即可!從編號最大的非葉子節點入手調整!
b> 如何調整堆! //根與左右孩子的大小關係,滿足堆的定義
#include #define swap(a, b) \
do while(0)
void heapadjust(int *a, int i, int size) //調整堆
}return ;
}void buildheap(int *a, int size)
void heapsort(int a, int size)
}int main()
; int size = 7;
int i;
for (i = 0; i < size; i++)
printf("%d ", a[i]);
printf("\n");
heapsort(a, size);
for (i = 0; i < size; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
注:堆排序是不穩定排序,其最壞時間複雜度為o(nlgn).堆排序的平均效能接近最壞效能,且建初始堆需要比較的次數較多,故適合元素較少的數列(記錄較少的檔案)!
資料結構之選擇排序
基本方法 從0索引開始,依次和後面元素比較,小的往前放,第一次完畢,最小值出現在了最小索引處,第二次找到第二小的值。具體是如何實現呢?第一輪是0索引上的資料依次跟後面各個索引上的資料進行比較,直到遇到乙個比它小的資料,這時候,這個小的資料就替換掉0索引上原來的資料,接著這個替換掉的資料繼續跟它原來的...
資料結構之選擇排序
選擇排序應該是最容易實現的一種排序方法,其原理很簡單,依舊分為兩塊資料,左邊選取資料與右邊的資料進行比較,取最小值,比較到最後的位置後交換資料,確保每一次比較中最小值都會調整到左邊並有序增加,實質上就是取最小值的函式,只不過外層包了乙個迴圈。void selectionsort int arr,in...
資料結構 排序演算法之選擇排序
一 選擇排序 最差的排序演算法 在選擇排序中,假定我們需要公升序,因此在每次排序中,需要找到最大的元素,將其放在最後,在每一次的迴圈中,都是將最大的元素放在最後,因此對於資料較多的陣列,迴圈的次數將與陣列中元素的個數一致,因此,在對於這種陣列進行排序時,將十分的浪費時間。有關選擇排序的思路,如下所示...