常見排序演算法大全

2021-07-12 03:49:56 字數 2939 閱讀 3673

宣告:本節全稱利用一維陣列展開討論,排列後結果均為由小到大

1、直接插入排序

思想:資料r[0]到r[i-1]是有序的,r[i]到r[n-1]是任意次序的。將r[i]插入到r[0]到r[i-1]中並使得r[0]到r[i]有序。i從1開始到結束進行n-1次。

//直接插入排序

//時間複雜度o(n^2),空間複雜度o(1),穩定

void insertsort(int *a,int n)

else

}//上面出迴圈是j--

a[j+1] = key;}}

2.折半插入排序

思想:在有序部分使用二叉查詢方法確定插入位置,其他同上

//折半插入排序

//時間複雜度o(n^2),空間複雜度o(1),穩定

void binsort(int *a,int n)

else

low = mid+1;

}for(j = i-1;j>=low;j--)

a[low] = key;}}

3.shell排序

思想:比較每組兩端的元素,後面的大則進行交換,依次進行

1) 選定記錄間的距離為d1在整個待排序記錄序列中將所有間隔為d1的記錄

分成一組,進行組內直接插入排序;

2) 取記錄間的距離為d2(d2

//shell排序

//時間複雜度o(n^1.5),空間複雜度o(1),不穩定

void shell(int *a,int n,int d)

}a[j+d] = key;

}d-=2;}}

4.起(冒)泡排序

思想:

依次比較相鄰兩個元素,如果後面的數大,則進行交換,每一趟都將最大的數下沉到最低端,共進行n-1趟

//氣泡排序

//時間複雜度o(n^2),空間複雜度o(1)

void bubblesort(int *r,int

length)}}

5.快速排序

思想:若序列中有n個元素,將第乙個資料作為支點,將它放在表中合適的位置。以支點為界,序列分成兩部分。其中左邊資料小於等於支點,右半部分資料大於等於支點。然後,對左右兩部分分別進行遞迴處理,直至排好序為止。

//快速排序

//時間複雜度o(nlog2(n)),空間複雜度:需棧空間以實現遞迴,最壞情況:s(n)=o(n),一般情況:s(n)=o(log2n)

void qsort(int *a,int low,int high)

//支點為j

while(iif(i//交換

// temp = a[i];

// a[i] = a[j];

// a[j] = temp;

a[j] = a[i];

j--;}}

a[i] = x;

qsort(a,low,i-1);

qsort(a,i+1,high);}}

6.選擇排序

思想:每一趟在n-i+1(i=1,2,3,…,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。

//簡單選擇

//時間複雜度o(n^2),空間複雜度o(1)

void select(int *a,int n)

}//交換

temp = a[i];

a[i] = a[k];

a[k] = temp;}}

7.堆排

思想:把待排序記錄的關鍵字存放在陣列r中,將r看成一棵完全二叉樹的順序表示,每個結點表示乙個記錄,第乙個記錄r[1]作為二叉樹的根,以下各記錄依次逐層從左到右順序排列,任意結點r[i]的左孩子是r[2i],右孩子是r[2i+1],雙親是r[i/2]。對這棵完全二叉樹進行調整建堆。

堆的定義:

n 元素的序列 ,當且僅當對任一ki滿足以下關係時,稱之為堆:

ki <= k2i ki >= k2i

ki <= k2i+1 ki >= k2i+1

且分別稱之為最小化堆和最大化堆。

演算法:

a.將待排序記錄按照堆的定義建初堆;

b.將堆頂元素與堆中最後一位元素交換。調整剩餘的記錄序列,將前n-i個元素重新建成為乙個新堆;

c.重複步驟b,進行n-1次。

//堆排

//時間複雜度o(nlog2n),空間複雜度o(1),不穩定,n越大越好

void adjust(int *a,int n)

}if(a[i]//交換

temp = a[i];

a[i] = a[j];

a[j] = temp;}}

}void heapsort(int *a,int n)

}

8.歸併排序

思想:將已排序的若干個表合併成乙個有序表。當將兩個有序表歸併為乙個時稱為2-路歸併。

排序:開始將資料看成長度為1的有序表,兩兩歸併為長度為2的表,依次類推直到長度為n的有序表

//歸併排序

//時間複雜度o(nlogn),空間複雜度o(n)

排序演算法大全

include include define maxsize 100 typedef int datatype void selectsort datatype x,int n 選擇排序 void bubblesort datatype x,int n 氣泡排序 void quicksort dat...

C 排序演算法大全

氣泡排序 學語言要花大力氣學資料結構和演算法。using system namespace bubblesorter j public class mainclass bubblesorter sh new bubblesorter sh.sort iarrary for int m 0 m iar...

C 排序演算法大全

c 排序演算法大全 本人用了c 開發出氣泡排序演算法。希望能為c 語言的學習者帶來一些益處。不要忘了,學語言要花大力氣學資料結構和演算法。using system namespace bubblesorter public class bubblesorter public void sort in...