排序始终是个绕不过去的问题 0.0
归并排序
思路
- 步骤
- 划分问题: 把序列分成元素个数尽量相等的两半
- 递归求解:把两半元素分别排序
- 合并问题:把连个有序表合并成一个
- 算法的时间复杂度: O(nlogn) (这个我还没理解)
注意
- 在上图中,比如说当序列变成 A[i]:38,49,65,97B[j]:13,27,76 并将A和B合并到T中在合并的过程中,都是从A中拿出当前第i个元素和B中第j个元素比较的, 但是到了最后,肯定是某个数组全部的合并到了T中,但是另一个数组中的元素有剩余,这时间,将剩余的元素全部合并到T中(在此例中指的A,因为当B全部进到T中时,A还有97这个元素)
代码
public static void mergeSort(int x,int y){
if (y-x > 1){
int m = x + (y-x)/2;
int p = x;
int q = m;
int i = x;
mergeSort(x, m);
mergeSort(m, y);
while (p<m || q<y){
if (q >=y || (p<m && data[p] <= data[q])){
// 这里是左半部分进入数组temp的条件,即要么比右边的元素小,要么右边的元素已经全部进入temp数组
temp[i++] = data[p++];
}else{
temp[i++] = data[q++];
}
}
for ( i=x; i<y; i++){
data[i] = temp[i];
}
}
}
插入排序
思想
- 其实插入排序就像是打扑克牌:
- 手里已经有的牌是有序的
- 当来一种新牌的时候,则从最后一个牌开始比较,慢慢的向前迭代
- 如果已有的牌比新牌大,则把已有牌往后移动一个位置
- 如果已有牌不大,则已有牌的后面插入新牌
代码
public int[] insertSort(int[] nums) {
int j,temp;
for (int i = 1; i < nums.length; i++) {
temp = nums[i];
for ( j = i; j > 0 && temp > nums[j-1]; j--) {
nums[j] = nums[j-1];
}
nums[j] = temp;
}
return nums;
}
快排
代码
这个算法真是个激动人心的算法