宣告:本節全稱利用一維陣列展開討論,排列後結果均為由小到大
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...