最早接觸到得排序演算法,也是最熟悉的,效率可能也是最低的。它是穩定的,時間複雜度為o(n*n),空間複雜度為o(1)。
演算法思想:
相鄰資料比較,最大/小沉到最後。
核心**:
for(int i=0;i
length;i++)
for(int j=1;j
length-i;j++)
if(a[j-1]>a[j])
swap(a[j-1],a[j]);
插入排序也是穩定的,平均空間,時間複雜度都和冒泡一樣。
演算法思想:
將待排序的資料插入已排好的序列中。
核心**:
for(int i=1;i
length;i++)
for(int j=i-1;j>=0&&a[j]>a[j+1];j--)
swap(a[j],a[j+1]);
這是乙個不穩定的排序演算法,平均時間複雜度為o(nlog2n),空間複雜度為o(1)
演算法思想:
將資料分為若干組,然後進行插入排序。
核心**:
//將直接插入排序的1換成gap
for(int gap=n/2;gap>0;gap/=2)
for(int i=gap;ifor(int j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap)
swap(a[j],a[j+gap]);
不穩定,o(n2),o(1)
演算法思想:
從無序區選最小的資料放在有序區最後,感覺很像冒泡,把最小的資料冒到最上面,但是不同的是選擇排序是用陣列的下標來確定位置,不是一次次交換資料。
核心**:
for(int i=0;iint
min = i;
for(j=i+1;jif(a[j]min])
min = j;
swap(a[i],a[min]);
}
穩定,o(nlogn),o(n)
演算法思想:
將有序數列合併。先遞迴,再合併。速度比冒泡、插入快很多。
//遞迴
void merge(int a,int first,int
last,ing t)
}//將兩個有序數列合併
void merge_array(int a,int first,int mid,int
last,int temp)
while(f<=m)
temp[k++] = temp[k++];
while(j<=l)
temp[k++] = temp[j++];
for(f=0;fa,int left,int right)
a[l] = temp;
quick(a,l,l-1);
quick(a,l+1,r);
}}
我認為最難的排序,看了好久都沒看懂,現在繼續去看t_t
排序 各種排序演算法
每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...
各種排序演算法
交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...
各種排序演算法
include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...