**
排序:排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
排序的穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排
序演算法是穩定的;否則稱為不穩定的。
內部排序:資料元素全部放在記憶體中的排序
外部排序:資料元素太多不能同時放在記憶體中,根據排序過程的要求不能在內外存之間移動資料的排序。
基本思想:把待排序的記錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列 。
演算法實現:
void
insertsort
(int a,
int size)
a[j +1]
= k;
}}
時間複雜度:o(n^2)
空間複雜度:o(1)
穩定性:穩定
應用場景:檔案初始狀態基本有序時
基本思想:先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。
演算法實現:
void
shellsort
(int a,
int size)
a[j + gap]
= k;}if
(gap ==1)
}}
時間複雜度:o(n1.3~n2)
穩定性:不穩定
基本思想:每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完 。
演算法實現:
void
selectsort
(int a,
int size)
if(a[i]
> a[max])}
swap
(&a[min]
,&a[left]);
if(max == left)
swap
(a + max, a + right)
; left++
; right--;}
}
時間複雜度:o(n^2)
空間複雜度:o(1)
穩定性:不穩定
基本思想:通過堆來進行選擇資料。排公升序要建大堆,排降序建小堆。
演算法實現:
void
heapify
(int a,
int size,
int index)
int max = left;
if(right < size && a[right]
> a[left])if
(a[index]
>= a[max]
)swap
(a + index, a + max)
;heapify
(a, size, max);}
void
createheap
(int a,
int size)
}void
heapsort
(int a,
int size)
}
時間複雜度:o(n*log n)
空間複雜度:o(1)
穩定性:不穩定
基本思想:根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。
演算法實現:
void
bubblesort
(int a,
int size)}if
(sorted ==1)
}}
時間複雜度:o(n^2)
空間複雜度:o(1)
穩定性:穩定
基本思想:任取待排序佇列中的某元素作為基準值,按照該排序碼將待排序集合分割成兩個子串行,左子串行中所有元素均小於基準值,右子串行中所有元素均大於基準值,然後最左右子串行重複該過程,直到所有元素都排列在相應位置上為止。
將區間按照基準值劃分為左右兩半部分的常見方式有:
hoare版本
挖坑法前後指標版本
演算法實現:
//hoare版本
intpartition1
(int a,
int left,
int right)
while
(begin < end && a[end]
>= pivot)
swap
(a + begin, a + end);}
swap
(a + begin, a + right)
;return begin;
}//挖坑法
intpartition2
(int a,
int left,
int right)
a[end]
= a[begin]
;while
(begin < end && a[end]
>= pivot)
a[begin]
= a[end];}
a[begin]
= pivot;
return begin;
}//前後指標方法
intpartition3
(int a,
int left,
int right)
}swap
(a + div, a + right)
;return div;
}
時間複雜度:o(n*log n)
空間複雜度:o(1)
穩定性:不穩定
基本思想:將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。
演算法實現:
void
mergesortinternal
(int a,
int low,
int high)
int mid =
(low + high)/2
;mergesortinternal
(a, low, mid)
;mergesortinternal
(a, mid, high)
;merge
(a, low, mid, high);}
void
mergesort
(int a,
int size)
void
test()
;int size =
sizeof
(a)/
sizeof
(int);
quicksort
(a, size)
;printarray
(a, size)
;}
時間複雜度:o(n*logn)
空間複雜度:o(n)
穩定性:穩定
基本思想:對於給定的輸入序列中的每乙個元素x,確定該序列中值小於x的元素的個數(此處並非比較各元素的大小,而是通過對元素值的計數和計數值的累加來確定)。一旦有了這個資訊,就可以將x直接存放到最終的輸出序列的正確位置上。
演算法實現:
void
count_sort
(int
*arr,
int*sorted_arr,
int n)
free
(count_arr)
;}
時間複雜度:o(max(n,範圍))
空間複雜度:o(範圍)
穩定性:穩定
八大排序 堆排序
堆排序 利用大頂堆 小頂堆 堆頂記錄的是最大關鍵字 最小關鍵字 這一特性,使得每次從無序中選擇最大記錄 最小記錄 變得簡單。其基本思想為 大頂堆 1 將初始待排序關鍵字序列 r1,r2 rn 構建成大頂堆,此堆為初始的無須區 2 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1...
八大排序 希爾排序
希爾排序 shell sort 是插入排序的一種。是直接插入排序的改進版,它是非穩定排序演算法。其得名於它的提出者d.l.shell,shell sort等演算法的提出打破了 排序演算法不可能突破o n 2 的魔咒,它將排序演算法的時間複雜度提成到了o nlogn 不可能超越的o n 2 徹底成為了...
八大排序 選擇排序
n個資料的檔案可經過n 1趟直接選擇排序得到有序結果。初始狀態 無序區 r 1.n 有序區為空。第一趟排序 在無序區r 1.n 選出下標最小的記錄r 1 通過比較獲得無序區中最小的,將他與無序區的第乙個記錄r 1 交換,使得r 1.1 和r 2.n 成為新的有序區域,和新的無序區域。第i趟排序 第i...