排序是計算機程式設計中的一種重要操作,它的功能是將乙個資料元素的序列。重新排列成有序的序列。
排序的時間複雜度,空間複雜度,還有穩定性往往是選取的目標。時間複雜度,空間複雜度越低越好,穩定性越穩定越好。時間,空間即消耗的越小越好。穩定性則是看資料是否有跳躍交換,跳躍的話就不穩定,不跳躍(相鄰交換)就穩定。
常見的排序演算法有八種。現就這八種展開描述:
1.建立大根堆:把所有資料按照完全二叉樹建立堆,規則如下: 每個根結點下標為i,左孩子下標為(2*i+1),右孩子下標為 (2*+2)。大根堆就是每個子樹的根結點數值都要大於孩子結點數值。所以要從最後乙個數開始比較,把最大的數放到 所有樹的根結點。
2.把大根堆的根結點的值和當前最後子結點的值進行交換,即把大的資料放到後面,即這個數視為有序,除去當前資料序列。再 次建立大根堆,再次交換,依次進行。直到只剩根結點。
//這裡使用封裝函式,思路更清晰
//時間複雜度為o(nlogn), 空間複雜度o(1),不穩定
*/void swap(int* a,int* b)//交換函式
void oneadjust(int* arr,int len,int root)///排序,使樹有序,即根結點大於子結點
if(tmp > arr[max])
arr[root] = arr[max];
root = max;
left = 2 * root + 1;
right = 2 * root + 2;
}arr[root] = tmp;
}void greatheap(int* arr,int len)//建立大根堆
}void heapsort(int* arr,int len)
}#define n 10
int main()
;int i = 0;
for(;i < n;i++)
printf("\n");
printf("排序如下:\n");
heapsort(arr,n);
for(i = 0;i < n;i++)
printf("\n");}/*
1.找資料序列乙個資料為基準,設立兩個下標i,j.分別放在資料序列的頭和尾.j從後往前走,找比基準小的第乙個數,並把這個資料放到i的位置。然後i從前往後走,找比基準大的第乙個數,放到j的位置。然後依次進行。直到ij相遇。以這個數為中間數,把資料序列分開,前面的數列為比次數小的數,後面的數為比此數列大的數。
2.可以用遞迴,把兩邊的數列分別依次排序,調整成有 序數列。思想簡單,但運算元過大,會造成記憶體溢位。
3.也可以用棧的方法求解。
// 時間複雜度(o(nlogn)) 空間複雜度o(1) 不穩定
*/int quick(int* arr,int start,int end)//先遍歷一遍,劃分資料
arr[start] = arr[end];
while(start < end)
arr[end] = arr[start];
}arr[start] = tmp;
return start;
}void onequick(int* arr,int start,int end)//遞迴遍歷mod兩邊的資料
if(end - mod > 1)
}void quicksort(int* arr,int len)
/*一列資料,定義兩個下標 i 和 j,i的下標為資料序列第二個,j的下標為資料i的前乙個。因為我們可以把乙個資料看成有序,兩個及以上資料無序,所以把i定義為第二數的下標,並且我們把i下標之前的資料看成有序,把i插入i之前的序列。直到插完結束。
//時間複雜度o(n^2),空間複雜度o(1),穩定
*/void insertsort(int* arr,int len)
arr[j+1] = arr[j];//arr[j] > tmp就執行
}arr[j+1] = tmp;}}
/*其實也是插入排序,在插入排序的基礎上分組,先對每組的資料進行排序,使每組資料有序,然後將有序的組進行排序,分組也不固定,視情況而定。一般就5組,3組,1組。以這樣的順序。依次使整個資料序列趨於有序。最終使整個資料序列有序。
//時間複雜度o(n^1.3)~o(n^1.5),空間o(1),不穩定
*/void shellgroup(int* arr,int len,int group)
arr[j+group] = arr[j];
}arr[j+group] = tmp;}}
void shellsort(int* arr,int len)
;for(int i = 0;i < sizeof(str)/sizeof(str[0]);i++)}/*
一列資料,把最小的放在第乙個,第二個數與剩下的數進行比較 再把最小的放在前面。依次進行,直到最後乙個數,排列完畢。
//時間複雜度o(n^2),空間複雜度o(1),不穩定
*/void selectsort(int*arr,int len)
}if(min != arr[i])}}
/*挨個比較,小的放前,大的排後。乙個數視為有序一趟只能確定乙個數,所以n個數需要(n-1)趟。
時間複雜度為o(n^2),空間複雜度為o(1),穩定
*/void bubblesort(int* arr,int len)}}
}
氣泡排序,選擇排序,快速排序,堆排序詳解
選擇排序,堆排序,快速排序都是不穩定的排序演算法。a,氣泡排序 氣泡排序 每次將相鄰兩個數比較,如果不滿足排序條件則交換位置 比較次數 k n 1 k 1 2 n n 1 時間複雜度 o n public class bubblesort 一趟完畢後,從第乙個元素開始,每相鄰兩個元素,前乙個元素小於...
希爾排序,堆排序,快速排序
插入排序的改進演算法,不穩定的排序演算法,空間複雜度為o 1 public static void shellsort int a 氣泡排序的改進演算法,不穩定的排序演算法 空間複雜度在o log2n 和o n 之間 時間複雜度在o n 和o n2 之間,平均時間複雜度為o nlog2n 而當陣列初...
希爾排序,快速排序,堆排序
最近在準備資料結構的考試,於是用部落格記錄下自己複習的過程。今天的內容是三種高階排序。希爾排序 當序列增量為incr k 2 t k 1 1時,時間複雜度為o n1.5 以序列增量分組,對每組進行大小調整。templatevoid shellinsert t elem,int n,int incr ...