排序
1
冒泡
双循环
2
快速排序
从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
void quickSort(int left, int right, vector& arr)
{ if(left >= right) return;
int i, j, base, temp; i = left, j = right;
base = arr[left]; //取最左边的数为基准数
while (i < j)
{ while (arr[j] >=(从大到小,从小到大<=) base && i < j) j–;
while (arr[i] <=(从大到小,从小到大<=) base && i < j) i++;
if(i < j)
{ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
} //基准数归位
arr[left] = arr[i];
arr[i] = base;
quickSort(left, i - 1, arr);//递归左边
quickSort(i + 1, right, arr);//递归右边
}
3
希尔排序(快速排序高级版)
选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
按增量序列个数 k,对序列进行 k 趟排序;
每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
#include
using namespace std;
const int INCRGAP = 3;
void shellSort(int a[],int len)
{ int insertNum = 0; unsigned gap = len/INCRGAP + 1; // 步长初始化,注意如果当
len<INCRGAP时,gap为0,所以为了保证进入循环,gap至少为1!!!
while(gap) // while gap>=1
{ for (unsigned i = gap; i < len; ++i) // 分组,在每个子序列中进行插入排序 { insertNum = a[i];//将当前的元素值先存起来方便后面插入
unsigned j = i;
while (j >= gap && insertNum < a[j-gap])//寻找插入位置
{ a[j] = a[j - gap]; j -= gap; } a[j] = insertNum;
} gap = gap/INCRGAP;
}
} int main()
{ int array[11] = {2, 1, 4, 3, 11, 6, 5, 7, 8, 10, 15};
shellSort(array, 11);
for(auto it: array)
{ cout<<it<<endl;
}
return 0;