- 划分
以数组第一个元素temp为标准划分比较:
void partition(int arr[],int n)//不需要返回故设为void类型,一个数组及表示其长度的变量
{
int temp;
int i= 0,j= n-1;
temp = arr[i];
while(i < j)
{
while(i < j && arr[j] >= temp) --j; //在内循环中还需要判断i<j
if(i < j) //经过上面的while循环后可能i=j,所以需要再次判断i<j
{
arr[i] = arr[j];
++i;
}
while(i < j && arr[i] < temp) ++i;
if(i < j)
{
arr[j] = arr[i];
--j;
}
}
arr[i] = temp;
}
以表以外的值为标准划分比较:
分界线和枢轴的位置:取来比较的元素大于枢轴元素时,分界线就出现在枢轴的右边,反之出现在枢轴的左边;若恰好等于枢轴元素时,分界线就是枢轴本身。
void partition(int arr[],int n,int comp) //需要表达的值comp作为参数传进去
{
int temp;
int i= 0,j= n-1;
temp = arr[i];
while(i < j)
{
while(i < j && arr[j] >= comp) --j; //在内循环中还需要判断i<j
if(i < j) //经过上面的while循环后可能i=j,所以需要再次判断i<j
{
arr[i] = arr[j];
++i;
}
while(i < j && arr[i] < comp) ++i;
if(i < j)
{
arr[j] = arr[i];
--j;
}
}
arr[i] = temp;
}
以数组中任意一个位置(如数组下标k)上的元素来作为枢轴来划分
void partition(int arr[],int n,int k)
{
int temp;
int i= 0,j= n-1;
temp = arr[0];
arr[0]=arr[k];
arr[k]=temp;
temp=arr[i];
while(i < j)
{
while(i < j && arr[j] >= temp) --j; //在内循环中还需要判断i<j
if(i < j) //经过上面的while循环后可能i=j,所以需要再次判断i<j
{
arr[i] = arr[j];
++i;
}
while(i < j && arr[i] < temp) ++i;
if(i < j)
{
arr[j] = arr[i];
--j;
}
}
arr[i] = temp;
}
- 求最值
//求最大值
int max = a[0];
int maxIdx = 0; //保存最大值的位置
for (int i =0; i<n; ++i)
{
if (max < a[i])
{
max = a[i];
maxIdx = i;
}
}
//求最小值
int min = a[0];
int minIdx = 0; //保存最大值的位置
for (int i =0; i<n; ++i)
{
if (min > a[i])
{
min = a[i];
minIdx = i;
}
}
- 逆置:把表中原来的所有元素逆序输出
//无论是奇数个结点还是偶数个结点都可以用该循环实现
for(int i = left, j= right; i<j; ++i,--j)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}