寫幾個常用的排序:
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 合併...