1.直接插入思想
low的写法:
SqList Delete_same(SqList l){
int k=0;//k为重复元素的总个数,例如:{1,1,2,2,2}中k=3
for(int i=1;i<l.length;i++){
if(l.data[i]==l.data[i-1])
k++;
l.data[i-k]=l.data[i];
}
l.length-=k;
return l;
}
high:(直接插入思想)
2.归并思想
归并排序:
public class MergeSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
// 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
if (arr.length < 2) {
return arr;
}
int middle = (int) Math.floor(arr.length / 2);
int[] left = Arrays.copyOfRange(arr, 0, middle);
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
return merge(sort(left), sort(right));
}
protected int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0;
while (left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
} else {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
}
while (left.length > 0) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}
while (right.length > 0) {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
return result;
}
}
3.reverse函数(组合使用)
用途:数组内元素互换,循环左右移p个位置
void reverse(int R[],int from,int to){
int i,temp;
for(i=0;i<(to-from+1)/2;i++){
temp=R[from+i];R[from+i]=R[to-i];R[to-i]=temp;
}
}
void converse(int R[],int n,int p){
reverse(R,0,p-1);
reverse(R,p,n-1);
reverse(R,0,n-1);
}
10题另解
void move(int a[],int n,int p){
int j=0;
for(int i=0;i<p;i++) b[i]=a[i];
for(int i=p;i<n;i++) a[i-p]=a[i];
for(int i=n-p;i<n;i++) a[i]=b[j++];
}