

void move(ElemType A[],int len){
//对表A按奇偶进行一趟划分
int i=0,j=len-1; //i表示左端偶数元素的下标;j表示右端奇数元素的下标
while(i<j){
while(i<j&&A[i]%2!=0) i++; //从前往后找到一个偶数元素
while(i<j&&A[j]%2!=1) j--; //从后往前找到一个奇数元素
if (i<j){
Swap(A[i],A[j]); //交换这两个元素
i++; j--;
}
}
}
int kth_elem(int a[],int low,int high,int k){
int pivot=a[low];
int low_temp=low; //由于下面会修改low与high,在递归时又要用到它们
int high_temp=high;
while(low<high){
while(low<high&&a[high]>=pivot)
--high;
a[low]=a[high];
while(low<high&&a[low]<=pivot)
++low;
a[high]=a[low];
}
a[low]=pivot;
//上面为快速排序中的划分算法
//以下是本算法思想中所述的内容
if(low==k) //由于与k相同,直接返回pivot元素
return a[low];
else if(low>k) //在前一部分表中递归寻找
return kth_elem(a,low_temp,low-1,k);
else //在后一部分表中递归寻找
return kth_elem(a,low+1,high_temp,k);
}


typedef enum{RED,WHITE,BLUE} color; //设置枚举数组
void Flag_Arrange(color a[],int n){
int i=0,j=0,k=n-1;
while(j<=k){
switch(a[j]){//判断条块的颜色
case RED: Swap(a[i],a[j]);i++;j++;break;
//红色,则和i交换
case WHITE: j++;break;
case BLUE: Swap(a[j],a[k]);k--;
//蓝色,则和k交换
//这里没有j++语句,以防止交换后a[j]仍为蓝色
}
}
}
int setPartition(int a[], int n){
int pivotkey, low=0,low0=0,high=n-1,high0=n-1,flag=1,k=n/2,i;
int s1=0,s2=0;
while(flag) {
pivotkey=a[low]; //选择枢轴
while(low<high) { //基于枢轴对数据进行划分
while(low<high && a[high]>=pivotkey) --high;
if(low!=high) a[low]=a[high];
while(low<high && a[low]<=pivotkey) ++low;
if(low!=high) a[high]=a[low];
}
a[low]=pivotkey; //end of while(low<high)
if(low==k-1) //若枢轴是第n/2小的元素,划分成功
flag=0;
else{ //是否继续划分
if(low<k-1){
low0=++low;
high=high0;
}
else{
high0=--high;
low=low0;
}
}
}
for(i=0;i<k;i++) s1+=a[i];
for(i=k;i<n;i++) s2+=a[i];
return s2-s1;
}

void selectSort(LinkedList& L){
//对不带头结点的单链表L执行简单选择排序
LinkNode *h=L,*p,*q,*r,*s;
L=NULL;
while(h!=NULL){ //持续扫描原链表
p=s=h;q=r=NULL;
//指针s和r记忆最大结点和其前驱;p为工作指针,q为其前驱
while(p!=NULL){ //扫描原链表寻找最大结点s
if(p->data>s->data){s=p;r=q;} //找到更大的,记忆它和它的前驱
q=p;p=p->link; //继续寻找
}
if(s==h)
h=h->link; //最大结点在原链表前端
else
r->link=s->link; //最大结点在原链表表内
s->link=L;L=s; //结点s插入结果链前端
}
}
bool IsMinHeap(ElemType A[],int len){
if(len%2==0){ //len为偶数,有一个单分支结点
if(A[len/2]>A[len]) //判断单分支结点
return false;
for(int i=len/2-1;i>=1;i--) //判断所有双分支结点
if(A[i]>A[2*i]||A[i]>A[2*i+1])
return false;
}
else{ //len为奇数时,没有单分支结点
for(int i=len/2;i>=1;i--) //判断所有双分支结点
if(A[i]>A[2*i]||A[i]>A[2*i+1])
return false;
}
return true;
}

A,并初始化为int类型能表示的最大值。M中的每个元素s,如果s小于A[9](数组中最大的元素 ),就将s插入数组A并重新排序,保证数组A中始终保存当前最小的 10 个数。A中的元素。H,并先插入 10 个int类型能表示的最大值。M中的每个元素s,如果s小于堆顶元素(堆中最大的元素 ),就删除堆顶元素并插入s,维持堆的性质。
void cmpCountSort(int a[],int b[],int n){
int i,j,*count;
count=(int *)malloc(sizeof(int)*n);
//C++语言: count=new int[n];
for(i=0;i<n;i++) count[i]=0;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]<a[j]) count[j]++;
else count[i]++;
for(i=0;i<n;i++) b[count[i]]= a[i];
free(count); //C++语言: delete count;
}
1)排序结果为b[6]=(-10,10,11,19,25,25}。
for(i=0;i<n-1;i++)和for (j=i+1;j<n;j++)可知,在循环过程中,每个元素都与它后面的所有元素比较一次(即所有元素都两两比较一次),比较次数之和为(n-1)+(n-2)+…+1,所以总比较次数是n(n-1)/2。
3)不是。需要将程序中的 if 语句修改为:
if(a[i]<=a[j]) count[j]++;else count[i]++;若不加等号,两个相等的元素比较时,前面元素的count值会加1,则导致原序列中靠前的元素在排序后的序列中处于靠后的位置。

void Insert_Sort(ElemType A[],int m,int n){
int i,j;
// 外层循环,遍历从m+1到m+n的元素,依次将这些元素插入有序表
for(i=m+1;i<=m+n;i++){
// 将当前要插入的元素A[i]复制到A[0],A[0]作为哨兵,方便后续比较和移动元素
A[0]=A[i];
// 内层循环,从后往前比较,找到插入位置
for(j=i-1;A[j]>A[0];j--)
// 将比A[0]大的元素往后移动一位
A[j+1]=A[j];
// 将元素插入到合适位置
A[j+1]=A[0];
}
}
//时间复杂度由 m 和n共同决定,在最坏情况下元素的比较次数为O(mn),而元素移动的次数为O(mn),所以时间复杂度为O(mn)
int Partition(ElemType K[],int n){
int i=1,j=n; //设置两个交替变量初值分别为1和n
ElemType pivot=K[j]; //枢轴
while(i<j){ //循环跳出条件
while(i<j&&K[i]<=pivot)
i++; //从前往后找比枢轴大的元素
if(i<j)
K[j]=K[i]; //移动到右端
while(i<j&&K[j]>=pivot)
j--; //从后往前找比枢轴小的元素
if(i<j)
K[i]=K[j]; //移动到左端
} //while
K[i]=pivot; //枢轴存放在最终位置
return i; //返回存放枢轴的位置
}