排序演算法總結

2022-08-05 09:24:22 字數 2878 閱讀 7351

回到資料結構與演算法,再次把一些經典的排序演算法的**回顧一下。

可以想象手裡有一副撲克牌,從左到右是。一張一張來看。

4,3 排序有誤。將3插入到4前,變成 3,4。

3,4,7排序無誤。

3,4,7,1排序有誤,將1插入到3前,變成1,3,4,7

**為:

void swap(int &a, int & b)

int temp = a;

a = b;

b= temp;

void insertsort(int a, int length)

for(int i=1;ifor(int j=i;i>=0;j--)

if(a[j-1]>a[j]) swap(a[j-1], a[j]);

特徵:原地排序,空間複雜度為o(1)。平均時間複雜度為o(n2),最壞時間複雜度為o(n2)。排序是穩定的。

當基本有序時,使用插入排序效率很高。

特點就是像冒泡泡一樣,一點一點往前移動。總是將當前數與右邊數相比,如果當前數更大就和右邊的數交換,否則不交換。

例如陣列為。

第一輪:

第二輪:

第三輪: 結束

**如下:

void bubblesort(int a, int length)

int count = 1;

while(count >0)

count = 0;

for(int i=0;iif(a[i]>a[i+1])

swap(a[i], a[i+!]);

count++;

特點:原地排序,空間複雜度為o(1)。時間複雜度為o(n2),最壞時間複雜度為o(n2)。排序是穩定的。

關於堆排序介紹眾多,此處就不再放圖了。主要就是不斷交換父節點和子節點來維持有序。

**如下:

void heapsort(int a, int length)

//從最後乙個父節點開始,初始化堆

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

heapify(a, i, length);    

//然後不斷將最大值與最後的子節點交換,得到有序序列

for(int i=length-1;i>=0;i--)

swap(a[0], a[i]);

heapify(a, 0, i);

void heapify(int a, int start, int end)

int father = start, son = 2*father + 1;

while(son < end)

if(son + 1if(a[father] > a[son]) break;

else

swap(a[son], a[father]);

father = son;

son = father*2 + 1;

特點:原地排序,空間複雜度為o(1)。時間複雜度為o(nlogn),最好時間複雜度最壞時間複雜度都是o(nlogn)。為不穩定排序。

適合求topk問題。

簡單來說,就是一路從右往左掃掠,另一路從左往右掃掠,一旦遇到違反排序的,就交換。

void quicksort(int a, int start, int end)

if(start>=end) return;

int pivot = oncesort(a, start, end);

quicksort(a, start, pivot-1);

quicksort(a, pivot+1, end);

int oncesort(int a, int start, int end)

int i = start, j = end;

while(iwhile(iif(iwhile(iif(ireturn i;

特點:原地排序,空間複雜度為o(logn)。平均時間複雜度o(nlogn),最壞時間複雜度為o(n2)。排序不穩定。

當陣列基本有序時,時間複雜度反而會增加。因此一般在排序前先要打亂來保證高效。

典型的二分法排序。

void mergesort(int a, const int length)

int help[length];

merge(a, help, 0, length-1); 

void merge(int a, int help, int start, int end)

if(start>=end) return; 

int mid = (start + end)/2;

merge(a, help, start, mid);

merge(a, help, mid+1, end);

int l1 = start, l2 = mid, r1 = mid+1, r2 = end;

int k = l1;

while(l1<=l2 && r1<=r2)

if(a[l1]help[k++] = a[l1++];

else

help[k++] = a[r1++];

while(l1<=l2)  

help[k++] = a[l1++];

while(r1<=r2)

help[k++] = a[r1++];

for(int k = l1;k<=r2;k++)

a[k] = help[k];

特點:借助輔助陣列,非原地排序。空間複雜度為o(n)。平均時間複雜度為o(nlogn),最壞時間複雜度也為o(nlogn),為穩定排序。

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...