C 實現幾種排序

2021-06-06 19:38:20 字數 3806 閱讀 6512

寫幾個常用的排序:

1)氣泡排序

2)選擇排序

3)插入排序

4)歸併排序

5)快速排序

6)希爾排序

具體實現:

//氣泡排序

//i: start -> end - 1

//每一次兩兩比較array[i]與array[i+1],大的上浮,小下沉

//比較次數**於如果array[0]是最大值,則需要size - 1次才能放到正確的位置

templatevoid bubblesort(type* array,int start,int end)

}

//選擇排序

//每一次都從為選出值的陣列中選取最小的放在當前排放的位置處

templatevoid selectionsort(type* array,int start,int end)

}

//插入排序

//從i: start -> end

//在i之前的有序的陣列中找到正確的位置插入

templatevoid insertionsort(type* array,int start,int end)

}}

//歸併排序

//每次merge都是將start -> end 劃分為start -> middle -1 && middle -> end兩部分,吧兩個部分中最小的

//一半放到新的start -> middle - 1中去,其餘的未塞入的將start -> end 填滿

//mergesort 就是講一長串陣列劃分為兩半,用遞迴再劃分兩半的兩半... 自底向上排序完成

//此外:merge完成後,array: start -> middle -1 這前半部分的最大值 小於 array: middle -> end這後半部分的最小值

templatevoid merge(type* a,int start,int middle,int end)else

} //剩餘的都填滿temp

for(int i = 0;i < end - start + 1;i++)

if(!ischosen[i])

temp[index++] = a[start + i];

for(int i = 0;i < end - start + 1;i++)

a[start + i] = temp[i];

delete temp;

delete ischosen;

}templatevoid mergesort(type* array,int start,int end)

else if(end - start >= 2)

}

//快速排序

//就是找第一位a[start]為基準為,一輪partition之後,a[start]值的位置變為q

//q位置前都小於他,後面都大於他,然後就q所分割的兩部分再進行快排

templateint partition(type *a,int start,int end)

} swap(a[i],a[start]); //把基準的值放在中間,則左邊都小於他,右邊都大於他

return i;

}templatevoid quicksort(type *array,int start,int end)

}

//希爾排序

//步長要小於陣列元素數量,不然沒意義跳過

//通過不同的步進,選取相隔一樣步進的元素組成組,如步進為3時則a[0],a[3],a[6]...為一組

//由最初的步進長度,作為起始步進逐步減少到步進為一,變為普通的全陣列的插入排序

templatevoid shellpass(type* array,int start,int end,int d)

}} }

}templatevoid shellsort(type* array,int start,int end)

}

int main()

; int size = 15;

cout << "原陣列: " << endl;

for(int i = 0;i < size;i++)

cout << a[i] << " ";

cout << endl << endl;

int *array = new int[size];

for(int i = 0;i < size;i++)

array[i] = a[i];

cout << "bubblesort: " << endl;

bubblesort(array,0,size - 1);

for(int i = 0;i < size;i++)

cout << array[i] << " ";

cout << endl << endl;

for(int i = 0;i < size;i++)

array[i] = a[i];

cout << "selectionsort: " << endl;

selectionsort(array,0,size - 1);

for(int i = 0;i < size;i++)

cout << array[i] << " ";

cout << endl << endl;

for(int i = 0;i < size;i++)

array[i] = a[i];

cout << "insertionsort: " << endl;

insertionsort(array,0,size - 1);

for(int i = 0;i < size;i++)

cout << array[i] << " ";

cout << endl << endl;

for(int i = 0;i < size;i++)

array[i] = a[i];

cout << "mergesort: " << endl;

mergesort(array,0,size - 1);

for(int i = 0;i < size;i++)

cout << array[i] << " ";

cout << endl << endl;

for(int i = 0;i < size;i++)

array[i] = a[i];

cout << "quicksort: " << endl;

quicksort(array,0,size - 1);

for(int i = 0;i < size;i++)

cout << array[i] << " ";

cout << endl << endl;

for(int i = 0;i < size;i++)

array[i] = a[i];

cout << "shellsort: " << endl;

shellsort(array,0,size - 1);

for(int i = 0;i < size;i++)

cout << array[i] << " ";

cout << endl << endl;

return 0;

}

測試輸出:

C 實現幾種排序演算法

概念 氣泡排序的大概思想是兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序為止 1.普通冒泡法 void bubblesort vector vi 2.優化冒泡法,增加標誌位,對已經有序的序列不在進行比較 void bubblesort2 vector vi 概念 通過n i次關鍵字間的比較,...

c 實現幾種排序方法

1.簡介 插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃瞄過程中,需要...

幾種排序演算法的C 實現

插入排序 include define max size 1000 using namespace std 插入排序,pa為指向陣列的指標,n為陣列元素個數 void insert sort int pa,int n pa i key int main else free p1 free p2 合併...