排序:將一組雜亂無章的資料按照一定的規則有組織地排列起來。
排序的穩定性:如果在排序中,存在前後相同的兩個元素的話,排序前和排序後他們的相對位置不發生變化。
今天,先來學習插入排序和選擇排序:
插入排序
直接插入排序
(1)思想:
每一步將乙個待排序的元其排序碼的大小,插入到前面已將排好序的一組元素的合適位置上去,直到全部元素插入完為止。(2)複雜度元素集合越接近有序,直接插入排序演算法的時間效率越高。
最優:時間效率o(n) 已經有序,只需要比較n-1(3)優缺點:最差:時間複雜度o(n^2)
陣列全部為逆序,一共需要比較(n-1)+(n-2)+…+1,是乙個等差數列
空間複雜度:o(1),它是一種穩定的排序演算法。
優點:元素很少的時候,效率很高缺點:元素很多的時候,需要挪動很多資料,逆序或者接近逆序的情況下效率很差。
(5)**實現:
希爾排序 是對直接插入排序的一種優化,在直接插入排序之前進行預排序,將較小的元素快速地放到前面。void print(int *a,size_t n)
cout
a[end+1] = tmp;
}}int main()
; int
len = sizeof(a)/sizeof(a[0]);
insertsort(a,len);
print(a,len);
}
(1)思想:
先把元素進行分組,每一組的每乙個元素之間的間隙相等 ,對這些組分別進行直接插入排序. 將間隙縮小,重複上步驟,直到間隙值為1時,進行最後一趟直接插入排序。(2)複雜度:在逆序或者接近逆序的情況下比插入排序的效率高。(3)優缺點o(n)< 希爾排序的時間複雜度 < o(n*n)
空間複雜度:o(1) 占用有限的陣列空間
優點:解決了直接插入排序在元素較多,接近逆序情況下需要挪動很多資料的缺陷。缺點:在元素很多的時候,快速排序效率更高。
(5)**實現:
選擇排序 選擇排序(1)思想:void shellsort(int* a,size_t n)
a[end+gap] = tmp;//進行插入}}
}int main()
; int len = sizeof(a)/sizeof(a[0]);
shellsort(a,len);
print(a,len);
}
選擇出當前範圍內的最小值;將該最小值放入當前範圍的第乙個位置;縮小排序的範圍,直到只有範圍中只有乙個元素為止。(2)複雜度時間複雜度:o(n*n) 每趟排序比較的次數是乙個等差數列,是一種不穩定的排序演算法空間複雜度: o(1)
(4)**實現
堆排序 堆建立:公升序——>建大堆 降序——>建小堆void print(int *a,size_t n)
cout
; int
len = sizeof(a)/sizeof(a[0]);
selectsort(a,len);
print(a,len);
}
是一種處理大批量資料排序的演算法,使用了大堆(或小堆)的關鍵字最大(或最小)的特徵,建立堆進行排序,使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。
(1)思想:
首先根據元素建堆,然後將堆的根節點取出(將根節點與最後乙個節點進行交換),將前面len-1個節點繼續進行堆調整的過程,然後再將根節點取出,這樣一直到所有的節點都取出。(2)複雜度:堆排序單趟排序的時間複雜度為o(logn),需要排n次,所以堆排序的時間複雜度為o(n*logn)(3)優缺點空間複雜度o(1)
堆排序是一種不穩定的排序演算法
優點:排序比較快(4)**實現:缺點:堆排序只能排序儲存於陣列中的元素,故在某些場合無法使用。
void adjustdown(int* a, size_t n, size_t i)
else
} } void heapsort(int* a,size_t n)
//向下調整
for (int i = (n-2)/2; i >= 0; --i)
//堆排序的實質性部分
int end = n - 1;
//先將第乙個元素和最後乙個元素的值進行交換
//然後將最後乙個元素不再視為堆內的內容,縮小排序範圍
while (end>0)
//列印
for (size_t i = 0; i < 10; i++)
cout << endl;
}
選擇排序和插入排序
選擇排序 時間複雜度 o n 2 額外空間複雜度o 1 選擇排序是從陣列的第乙個值即arr 0 開始,先假定當前值為最小值,記下index值,向後遍歷陣列,當 arr i 小於arr index 時,令index i 一直到arr length 1 獲得最小值的index然後與arr 0 交換,此時...
插入排序和選擇排序
插入排序 插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者...
選擇排序和插入排序
public class caogao 將 temp 插入到空白位置 array j 1 temp public static void main string args insertsort i for int j i selectsort i for int j i 總體思想 都分為有序區和無序...