1、插入排序 (折半插排)
減治演算法排序
每次從無序區間選擇第乙個數,插入到有序區間的合適位置
2 3 4 5 9 1768
1 2 3 4 5 9 768
1 2 3 4 5 7 9 68
一共需要多少次插入 size-1
想清楚有序區間 無序區間
插入過程:每次把無序區間的第乙個數進行插入 在有序區間內遍歷
1)找到合適的位置
2)搬移原有資料 為該資料騰位
時間複雜度 逆序(o(n)^2)
正序(o(n))
越接近有序執行效率越高
空間複雜度 o(1)
穩定性:穩定
public static void insersort(int array)
}//j+1放到key位置
for(int k=i;k>j;k--)
array[j+1]=key;
}}
2、希爾排序
建立在插排之前 分組(預排序)
分組數目
size=10;gap=size
gap=gap/3+1
前提:利用插入排序,數字組越接近有序,時間效率越高
在插入排序之前做預排序(分組插排),是陣列盡可能接近有序
如何分組問題:
動態分組:gap=gap/3+1 gap=gap/2
時間複雜度
最好o(n) 平均o(n^1.3-1.4) 最壞(o(n^2))
時間複雜度 o(1)
穩定性:不穩定,相同的數被分到不同的組裡,無法保證
public static void insersortgap(int array,int gap)
array[j + gap] = key;}}
}public static void shellsort(intarray)
}}`3、選擇排序(直接選擇排序、堆排序)
減治演算法 n-1
每次遍歷無序遍歷(直接遍歷,利用堆) 找到無序區間最大的數
把最大的數放到無序區間的最後邊
一直選擇n-1 次 資料完全有序
時間複雜度 o(n^2)
空間複雜度 o(1)
穩定性 不穩定
public static void selectsort(int array)
}swap(array,max,j);
}}
4、堆排序
時間複雜度 o(n*log(n))
空間複雜度 o(1)
穩定性 不穩定
``public static void heapsort(int array)
}//向下調整
public static void heapify(intarray,int size,int index)
int max=left;
if(left+1array[index])
swap(array,index,max);
}}5、氣泡排序
時間複雜度 最好情況(o(n)) 最壞/平均(o(n^2))
空間複雜度(o(1)
穩定性: 穩定
區分低配選擇排序和氣泡排序
public static void bublesort(intarray)}}
}
重點:快速排序
分治演算法
步驟:1、在整個排序區間內 確定乙個基準值
2、遍歷整個待排序區間,將所有資料和基準值比較,最終達到
比基準值小的(可包含等於) 在基準值左邊 遞迴
大 右 (partition-分割)
3、用同樣的策略處理左右兩個小的待排序區間,直到
1)小區間沒有資料了size0
2)小區間已經有序了size1
public static void quicksortf(intarray)
int privotindex=partition(array,left,right);
}}
暫時先記錄這幾種排序
19 9.7
基於比較的排序(一)
整個區間被分成有序區間和無序區間 選擇無序區間的第乙個元素插入到有序區間合適的位置 public static void insertsort int array array j 1 v 希爾排序法的基本思想是 先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為此整數的記錄分在同一組內,並對...
Python基於比較的排序
1.平均時間複雜度均為o n2 的排序 1.1 插入排序 插入排序對少量元素的排序非常有效。工作機制就像打牌一樣,為了將牌插入到已排好序的牌中,需要將牌與手中的牌從右向左進行比較。1.2 氣泡排序氣泡排序通過重複的交換相鄰的兩個反序元素來將最大元素置於陣列末尾。1.3 選擇排序首先找出序列中的最大元...
演算法 排序 非基於比較的排序
非基於比較的排序與樣本的資料狀況有很大的關係,由於這個限制使其在工程中並不常用。非基於比較的排序有桶排序,基數排序,計數排序。這三者都能做到排序的穩定性,時間複雜度為 o n 空間複雜度為 o n 假設存在一組資料,裡面的資料只有 0 60 使用非基於比較的排序。思路 此時可以使用計數排序,準備 6...