数据结构(顺序表知识点补充)

91 阅读2分钟
  • 划分 88111f8b5f7c6d4f7b690781092ab02.jpg 以数组第一个元素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;
}

以表以外的值为标准划分比较:

eb30bcc93cf0361d21fea9d65fe1ee8.jpg 分界线和枢轴的位置:取来比较的元素大于枢轴元素时,分界线就出现在枢轴的右边,反之出现在枢轴的左边;若恰好等于枢轴元素时,分界线就是枢轴本身。 796baf7218a5bda0091dbca7d999553.jpg

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;
}