算法类型 包含算法
交换排序 冒泡、快速
插入排序 简单插入、希尔
选择排序 简单选择
归并排序 简单归并排序

基础排序 - 图1

冒泡排序

  1. public void sort(List<Integer> data){
  2. for(int i=0;i<data.size()-1;i++){
  3. for(int j=0;j<data.size()-1-i;j++){
  4. if(data.get(j)>data.get(j+1)){
  5. int temp = data.get(j);
  6. data.set(j,data.get(j+1));
  7. data.set(j+1,temp);
  8. }
  9. }
  10. }
  11. }

快速排序

  1. public void sort(List<Integer> data,int left,int right){
  2. if(left >= right){
  3. return;
  4. }
  5. int key = data.get(left);
  6. int i = left;
  7. int j = right;
  8. while(i < j){
  9. while(data.get(j)>=key && i < j){
  10. j--;
  11. }
  12. while(data.get(i)<=key && i < j){
  13. i++;
  14. }
  15. if(i < j){
  16. int temp = data.get(i);
  17. data.set(i,data.get(j));
  18. data.set(j,temp);
  19. }
  20. }
  21. data.set(left,data.get(i));
  22. data.set(i,key);
  23. sort(data,left,i-1);
  24. sort(data,i+1,right);
  25. }

简单插入排序

  1. public void sort(List<Integer> data){
  2. for(int i=1;i<data.size();i++){
  3. int key = data.get(i);
  4. int j = i-1;
  5. while(data.get(j) > key && j>0){
  6. int temp = data.get(j);
  7. data.set(j,data.get(j+1));
  8. data.set(j+1,temp);
  9. j--;
  10. }
  11. }
  12. }

希尔排序

  1. public void sort(List<Integer> data){
  2. for(int i=data.size()/2;i>0;i=i/2){
  3. for(int j=i;j<data.size();j++){
  4. int key = data.get(j);
  5. int index = j;
  6. while(index-i >=0 && data.get(index-i) > key){
  7. int temp = data.get(index);
  8. data.set(index,data.get(index-i));
  9. data.set(index-i,temp);
  10. index = index-i;
  11. }
  12. }
  13. }
  14. }

选择排序

  1. public void sort(List<Integer> data){
  2. for(int i=0;i<data.size()-1;i++){
  3. int min = i;
  4. for(int j=i;j<data.size();j++){
  5. if(data.get(min)>data.get(j)){
  6. min = j;
  7. }
  8. }
  9. int temp = data.get(i);
  10. data.set(i,data.get(min));
  11. data.set(min,temp);
  12. }
  13. }

归并排序

  1. public List<Integer> getResult(List<Integer> data){
  2. if(data.size()<2){
  3. return data;
  4. }
  5. int mid = data.size()/2;
  6. List left = data.subList(0,mid); //subList方法切出来的List是subList,会抛异常
  7. List right = data.subList(mid,data.size());
  8. return sort(getResult(left),getResult(right));
  9. }
  10. public List<Integer> sort(List<Integer> left,List<Integer> right){
  11. List<Integer> result = new ArrayList();
  12. while(left.size()>0 && right.size()>0){
  13. if(left.get(0)<right.get(0)){
  14. result.add(left.get(0));
  15. left.remove(0);
  16. }else{
  17. result.add(right.get(0));
  18. right.remove(0);
  19. }
  20. }
  21. if (left.size() >0){
  22. left.stream().forEach(l -> result.add(l));
  23. }
  24. if (right.size() >0){
  25. right.stream().forEach(r -> result.add(r));
  26. }
  27. return result;
  28. }

参考:https://www.cnblogs.com/onepixel/articles/7674659.html