內排序: 全部在記憶體裡實現的成為內排序.
外排序: 不僅需要記憶體還需要外存成為排序.
五大分類: 插入排序,選擇排序,交換排序,分配排序,歸併排序;
1.1 直接插入排序:
從小到大: 時間複雜度: o(
void directinsertionsort(int a,int n)
a[j] = temp;
}}
1.2 折半插入排序:
時間複雜度: o(
void binaryinsertionsort(int a,int n)
a[l] = temp; // 插進去
}}
1.3 希爾排序(shell)
分組, 組內一般採用直接插入法,
時間複雜度: o(
void shellsort(int a,int n,int s)
a[j+k] = temp; // 插入
} }}
2.1 直接選擇排序:
每次從中選擇最小的依次排序:
時間複雜度:o(
void directselectsort(int a,int n)
if( i!= temp)}}
2.2 樹形選擇排序:(競賽樹排序,或勝者樹)
時間複雜度: o(nlogn) 不穩定的;
**-> 堆排序;
1.1 氣泡排序:
最簡單的, 時間複雜度: o(
void bubblesort(int a,int n)
} }}
3.2 快速排序:
時間複雜度: o(nlogn) 不穩定的;
遞迴實現:
void quicklysort(int a,int low ,int high)
} if( l < high) quicklysort(a,l,high);
if( r > low) quicklysort(a,low,r);
}
非遞迴實現: 用棧 (stack)
void quicksortofstack(int a,int low, int high)
} if( l < temphigh) s.push(temphigh),s.push(l);
if( r > templow ) s.push(r),s.push(templow);
}}
四: 分配排序:
4.1 基數排序:
鍊錶, 克服順序儲存所存在的空間和時間耗費問題.
時間複雜度:o(
typedef struct forsort
forsort;
void radixsort(forsort *pdata,int clow,int chigh,int d)
templink;
int r = chigh - clow +1 ;
templink *tlink;
forsort *p;
int j;
tlink = new templink[sizeof(templink)*r];
for(int i = d-1 ; i >= 0; i--)
for(p = pdata; p!=null; p = p->next)
}int j = 0;
while(tlink[j].phead ==null) j++;
pdata = tlink[j].phead;
p = tlink[j].ptail;
for(int k = j+1; k < r ; k++)
}p->next = null;
} for( p = pdata; p!=null; p = p->next)
free(tlink);
}
4.2 歸併排序:
一般採用二路歸併排序:
時間複雜度o(nlogn)
穩定
void twowaymerge(int dst,int src,int s, int e1,int e2)
if( s1 <= e1)
memcpy(&dst[s],&src[s1],(e1-s1+1)*sizeof(int));
else
memcpy(&dst[s],&src[s2],(e2-s2+1)*sizeof(int));
}void onepassmerge(int dst,int src,int len , int n)
/* 還有剩餘 最多還倆2 */
if(i < n-len)
else
memcpy(&dst[i],&src[i],(n-i)*sizeof(int));/* 還有乙個 直接複製過去*/
}int b[120];
/* 二路歸併排序*/
void mergesort(int a,int n)
else
}}
資料結構之排序
在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。穩定的排序 時間複雜度 空間複雜度 氣泡排序 最差和平均是o n2 最好是o n 1 雙向氣泡排序 最...
資料結構之排序
package com.small 注意a 0 是否有意思,書上c語言基本都是將a 0 作為哨兵,那麼0號元素不能用,我這裡全部是flag代替 author small leaf public class sort else for j i 1 j high 1 j a high 1 flag 希爾...
資料結構之排序
常用的幾種排序方法 冒泡 插入 選擇 快排 歸併排序 1 冒泡 以公升序為例,也是有兩種思路,1 num 0 依次與後面比較將最小的放到第一位 2 將最大的放到最後一位。我比較習慣用第一種 1 include include using namespace std int main for int ...