常用排序(插入 堆 歸併)

2021-07-10 15:09:39 字數 2173 閱讀 5561

直接插入排序(insertion sort)的基本思想是:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。

對於乙個陣列a[n]來說,第一次a[0]就構成了已拍好序的子串行,而a[2]~a[n-1]為待排序的序列。每次插入即將a[i]插入到已經排好序的子串行a[0]~a[i-1]中,如此進行n-1次插入即可。

**實現:

public

void

insertsort(int a,int n)

if(j!=i-1)

a[j+1] = temp;//插入元素原a[i]}}

}

堆排序分為大頂堆和小頂堆。堆排序不適合元素較少情況。堆排序在最好最壞的情況下,其時間複雜度均為o(nlogn)。相對於快速排序來說,這是堆排序的最大優點。此外,堆排序僅需乙個記錄大小的供交換用的輔助儲存空間。

1、構造初始堆:

先將無序陣列構成二叉樹。然後對此二叉樹進行調整,從下標為i=n/2的節點開始考慮(因為此節點是下標最大的非葉子節點),判斷此節點與其左右節點三者之間最大的值,將其交換到父節點的位置上,如此直至i=0(根節點)調整後就會得到乙個頂部為最大值的堆,即為初始堆了。

2、進行堆排序 將堆頂元素輸出並與堆最後乙個元素交換,此時有序區的長度即為1,然後繼續調整堆

直至有序區的長度為n-1時即元素也全部有序輸出了,堆排序結束。

**實現:

public

class heapclass

buildheap(a, n);//建初始堆

for (int i = n-1; i >= 1; i--)

}//buildheap 建立初始堆

public

void

buildheap(int a,int n)

for (int i = n/2; i >= 0; i--)

}//adjustheap 調整堆

public

void

adjustheap(int a,int i,int n)

if((2*i+2

2*i+2]>a[max])

if(max!=i)

}//交換元素

public

void

swap(int a,int i,int j)

public

static

void

main(string args);

// int n = a.length;

// sortheap(a, n);

}}

歸併排序基本思路就是將陣列分成二組a,b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。為了達到合併的兩個序列有序,可以將a,b組各自分成二組,依次類推,當分出來的小組只有乙個資料時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣通過先遞迴的分解數列,再合併數列就完成了歸併排序。歸併排序的效率比較高.

**實現:

public

class mergesort else

} //判斷是否左/右存在剩餘元素,並將剩餘元素直接加在temp陣列的後面

while (lfirst <= m)

temp[k++] = a[lfirst++];

while (rfirst <= n)

temp[k++] = a[rfirst++];

//將temp存的合併後的序列賦給a相應位置

for (int i = 0; i < k; i++)

} //主歸併類

public

void

mergesort(int a, int first, int last)

}public

static

void

main(string args);

// int n = a.length;

// mergesort(a,0,n-1);

}}

快速排序,歸併,堆 ,STL

by morewindows include include include using namespace std 快速排序 void quick sort int s,int l,int r s i x quick sort s,l,i 1 遞迴呼叫 quick sort s,i 1,r 歸併排...

插入排序 歸併排序

插入排序 define len 5 int a len void insertion sort void int i,j,k for j 1 j len j k a j i j 1 while i 0 a i k a i 1 a i i a i 1 k 歸併排序 int a 8 void merge...

插入排序 歸併排序

演算法導論初涉,第一講練習內容 include define n 6 int a n void init 初始化陣列 a i 1 k void output int a,int n void merge int low,int mid,int high while s mid b i a s whi...