這裡對排序演算法做乙個總結,還未完結,後序還將加入希爾排序等排序方法。
將每乙個數依次與其後面的數做對比,如果前後兩個數逆序,則交換,然後進行下一步對比,經過每乙個交換,最大的數都會被換到陣列尾部,然後使陣列總長度減一,這裡為了節省時間,可以設定乙個標誌位,在每一次迴圈的開始都設為 true,如果在遍歷過程中發生交換,則同時置為 false,經過一次完整迴圈以後沒有發生過一次交換,則標誌位一直為 true 視為陣列已經有序,直接結束。
void bubblesort(vector&a)
} n--;
}}
每一次迭代都找到從出發位置開始後面陣列中的最小數字,然後讓其與當前位置的值互換,需要借助兩個中間遍歷來記錄最小值的位置與數值。
void selectionsort(vector&a)
} a[k] = a[i];
a[i] = temp;
}}
當陣列中只有乙個數時陣列肯定有序,這裡假設陣列前半部分是有序的,則只要從陣列的後半部分每次取乙個數,查詢到這個待插入的數在前半部分的位置,讓後將其加入,直到後半部分陣列長度為0,整個陣列即有序。
void insertsort(vector& a)
} }}
這裡首先找到乙個中心旋轉點,一般是陣列 a 的第乙個a[0]/最後乙個元素a[a.size()-1],這裡以 a[0] 為旋轉點為例,設定兩個哨兵i,j 分辨去找大於 a[0] 和 大於 a[0] 的點,哨兵 i 從左向右遍歷,當滿足 i <= j,並且a[i] > a[0]時,i停下,同理 j 從右向左找小於a[0] 的值,當滿足 i<=j,且 a[j] < a[0]時,j 停下,交換 a[i] 和 a[j],然後繼續向前尋找,直到 i> j 時,以 a[0] 為中間點的,然後對 a[0] 的左、右分辨重複上面的過程。
int partition(vector& a, int left, int right)
if (i < j)
swap(a[i], a[j]);
} swap(a[j], a[right]);
return j;
}void quicksort(vectora, int left, int right)
int j = partition(a, left, right);
quicksort(a, left, j - 1);
quicksort(a, j + 1, right);
}
void merge(vector&s1, vector& s2, vector& result)
else
} if (i < s1.size())
陣列實現
void merge(vector& a, int lo, int mi, int hi)
for (int j = 0; j < lr; j++)
l[ll] = int_max;
r[lr] = int_max;
for (int i = 0, j = 0, k = lo; k <= hi; k++) }
void mergesort(vector& a, int lo, int hi)
} if (hi - lo<1)
int mi = (hi + lo) >> 1;
mergesort(a, lo, mi);
mergesort(a, mi + 1, hi);
merge(a, lo, mi, hi);
}
void adjust(vector&arr, int len, int index)
}// 堆排序
void heapsort(vector&arr, int size)
// 調整大根堆
for (int i = size - 1; i >= 1; i--)
}
C語言排序演算法總結
排序演算法一直都是讓我頭疼的演算法。為了全面掌握排序演算法,我就整理了常用的排序演算法。首先我們來了解一些基本概念 1 穩定排序和非穩定排序 簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就 說這種排序方法是穩定的。反之,就是非穩定的。比如 一組數排序前是a1,a...
排序演算法總結 C 版)
1 時間複雜度 分析關鍵字比較次數和記錄的移動次數 2 空間複雜度 需要的輔助記憶體 3 穩定性 相同的關鍵字計算後,次序是否不變。直接插入排序 insertionsort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。例如 ...
常見排序演算法總結 C
以下排序演算法的排序結果若無特殊說明均為公升序,主要講述演算法的簡單原理,時間複雜度,空間複雜度和穩定性。其中 時間複雜度簡單來說就是演算法中基本操作重複執行的次數 空間複雜度並不是計算實際占用的空間,而是計算整個演算法的輔助空間 穩定性通俗地講就是能保證排序中相等的數其在序列的前後位置順序和排序後...