選擇,冒泡,快速,希爾,堆排序 C語言

2021-10-01 12:22:41 字數 2674 閱讀 2411

排序是計算機程式設計中的一種重要操作,它的功能是將乙個資料元素的序列。重新排列成有序的序列。

排序的時間複雜度,空間複雜度,還有穩定性往往是選取的目標。時間複雜度,空間複雜度越低越好,穩定性越穩定越好。時間,空間即消耗的越小越好。穩定性則是看資料是否有跳躍交換,跳躍的話就不穩定,不跳躍(相鄰交換)就穩定。

常見的排序演算法有八種。現就這八種展開描述:

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 ...