void QuickSort(int s[], int l, int r)
{
if (l< r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quickSort(s, l, i - 1); // 递归调用
quickSort(s, i + 1, r);
}
}
void SelectSort(int s[], int n)
{
int i,j,k;
for (i=0; i < n-1; i++)
{
k = i;
for (j=i+1; j < n; j++)
{
if (a[j] < a[k]) k = j;
}
if (k != i) swap(s[k],s[i]);
}
}
void BubbleSort(int s[], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (s[j] > s[j + 1])
{
swap(s[j], s[j + 1]);
}
}
}
}
void ShellSort(int s[], int n)
{
int gap; //gap为增量,为任意小于n的数
for(gap = 3; gap >0; gap--)
{
for(int i=0; i=0&&s[k]>temp)
{
s[k+gap] = s[k];
k = k-gap;
}
s[k+gap] = temp;
}
}
}
}
void InsertSort(int s[], int n)
{
for (int i = 1; i < n; i++) //默认第一个元素已经是有序的,因此从第二个元素开始
{
int j = i-1,temp=s[i];
while (j >=0&&s[j] > temp) //前一个元素比待插元素大
{
s[j+1] = s[j]; //如果待插入元素比拍好元素大,则循环右移大的那部分元素
//留出位置给待插元素
j--;
}
s[j+1] = temp; //插入元素
}
}
/*该函数将数组下标范围[l1,r1]和[l2,r2]的有序序列合并成一个有序序列*/
void merge(int nums[], int l1, int r1, int l2, int r2 ) {
int i = l1; //左半部分起始位置
int j = l2; //右半部分起始位置
int n = (r1 - l1 + 1) + (r2 - l2 + 1); //要合并的元素个数
vector temp(n); //辅助数组
int k = 0; //辅助数组其起始位置
while (i <= r1&&j <= r2) { //挑选两部分中最小的元素放入辅助数组中
if (nums[i] < nums[j])
temp[k++] = nums[i++];
else
temp[k++] = nums[j++];
}
//如果还有剩余,直接放入到辅助数组中
while (i <= r1)
temp[k++] = nums[i++];
while (j <= r2)
temp[k++] = nums[j++];
//更新原始数组元素
for (int i = 0; i < n;i++)
{
nums[l1 + i] = temp[i];
}
}
/*二路归并排序(递归实现)*/
void MergeSort(int nums[],int start, int end) {
if (start < end) {
int mid = (start + end)/2; //分割序列
MergeSort(nums, start, mid); //对序列左半部分进行归并排序
MergeSort(nums, mid + 1, end); //对序列右半部分进行归并排序
merge(nums, start, mid, mid + 1, end); //合并已经有序的两个序列
}
}
void adjust(int arr[], int len, int index)
{
int left = 2 * index + 1;
int right = 2 * index + 2;
int maxIdx = index;
if (left arr[maxIdx]) maxIdx = left;
if (right arr[maxIdx]) maxIdx = right; // maxIdx是3个数中最大数的下标
if (maxIdx != index) // 如果maxIdx的值有更新
{
swap(arr[maxIdx], arr[index]);
adjust(arr, len, maxIdx);// 递归调整其他不满足堆性质的部分
}
}
void heapSort(int arr[], int size)
{
for (int i = size / 2 - 1; i >= 0; i--) // 对每一个非叶结点进行堆调整(从最后一个非叶结点开始)
{
adjust(arr, size, i);
}
for (int i = size - 1; i >= 1; i--)
{
swap(arr[0], arr[i]); // 将当前最大的放置到数组末尾
adjust(arr, i, 0); // 将未完成排序的部分继续进行堆排序
}
}