1.快速排序(必会)
int Partition(SqList &L, int low, int high)
{
L.r[0] = L.r[low]; // 使用子表的第一个记录作为枢纽记录
pivotkey = L.r[low].key; // 枢纽记录关键字
while (low < high)
{
while (low < high && L.r[high].key >= pivotkey)
//while 循环体内只有一条语句时,可以省略花括号 {}
--high;
L.r[low] = L.r[high]; // 将比枢纽记录小的记录移动到低端
while (low < high && L.r[low].key <= pivotkey)
++low;
L.r[high] = L.r[low]; // 将比枢纽记录大的记录移动到高端
}
L.r[low] = L.r[0];
return low; // 返回枢纽位置
}
void QSort(SqList &L, int low, int high)
{
if (low < high)
{
pivotloc = Partition(L, low, high);
QSort(L, low, pivotloc - 1);
QSort(L, pivotloc + 1, high);
}
}
2.冒泡排序算法(简单)
视频教学指路:
// 冒泡排序函数
void bubbleSort(int arr[], int n) {
int i, j, temp;
for (i = 0; i < n-1; i++) {
for (j = 0; j < n-i-1; j++) {
// 如果前面的元素大于后面的元素,则交换它们的位置
if (arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
3.折半插入排序
// 折半插入排序函数
void binaryInsertionSort(int arr[], int n) {
int i, j, key, low, high, mid;
for (i = 1; i < n; i++) {
key = arr[i];
low = 0;
high = i - 1;
// 使用二分查找找到插入位置
while (low <= high) {
mid = (low + high) / 2;
if (key < arr[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
// 移动元素,为找到的插入位置腾出空间
for (j = i - 1; j >= low; j--) {
arr[j + 1] = arr[j];
}
// 插入元素到正确的位置
arr[low] = key;
}
}
4.直接插入排序
// 直接插入排序函数
void insertionSort(int arr[], int n) {
int i, j, key;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 将 arr[0...i-1] 中大于 key 的元素后移
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
// 插入 key 到正确的位置
arr[j + 1] = key;
}
}
5.归并排序(必会)
void merge(int[A],int low,int mid, int high){ //定义三个指针指向数组A
int i,j,k; //i,j指向B数组
for(k=0,k<=high,k++)
B[k]=A[k];
for(i=low,j=mid+1,i=k;i<=mid&&j<=high;k++)
if(B[i]<=B[j])
A[k]=B[i++];
else
A[K]=B[j++];
}
while(j<=high) A[k++]=B[j++];
while(i<=mid) A[k++]=B[i++];