当前位置:   article > 正文

十大排序算法(Java)_十大排序算法java csdn

十大排序算法java csdn

目录

1.冒泡排序

2.快速排序

3.插入排序

4.希尔排序

5.选择排序

6.堆排序

7.归并排序

8.计数排序:速度快,一般用于整数排序

9.桶排序

10.基数排序


1.冒泡排序

在这里插入图片描述

冒泡排序思路:(两层for循环)

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码:

  1. public class Demo01 {
  2. public static void main(String[] args) {
  3. int[] arr=new int[]{1,5,7,4,8,9};
  4. Demo01.sort(arr);
  5. }
  6. public static void sort(int arr[]){
  7. for( int i = 0 ; i < arr.length - 1 ; i++ ) {
  8. for (int j = 0; j < arr.length - 1 - i; j++) {
  9. int temp = 0;
  10. if (arr[j] > arr[j + 1]) {
  11. temp = arr[j];
  12. arr[j] = arr[j + 1];
  13. arr[j + 1] = temp;
  14. }
  15. }
  16. }
  17. System.out.println(Arrays.toString(arr));
  18. }
  19. }

2.快速排序

首先选取一个基准数

快速排序思路:

  • 选取第一个数为基准
  • 将比基准小的数交换到前面,比基准大的数交换到后面
  • 对左右区间重复第二步,直到各区间只有一个数

代码:

  1. public class Demo02 {
  2. public static void main(String[] args) {
  3. int[] arr=new int[]{1,5,3,6,7,4,8};
  4. Demo02.sort(arr,0,6);
  5. System.out.println(Arrays.toString(arr));
  6. }
  7. public static int potation(int[] nums,int low,int high){
  8. int point=nums[low];
  9. while(low<high){
  10. while(low < high &&nums[high]>=point) high--;
  11. nums[low]=nums[high];
  12. while(low < high &&nums[low]<=point) low++;
  13. nums[high]=nums[low];
  14. }
  15. nums[low]=point;
  16. return low;
  17. }
  18. public static void sort(int[] nums,int low,int high){
  19. if(low<high){
  20. int pivotpos=potation(nums,low,high);
  21. sort(nums,low,pivotpos-1);
  22. sort(nums,pivotpos+1,high);
  23. }
  24. }
  25. }

3.插入排序

插入排序思路:

  • 从第一个元素开始,该元素可以认为已经被排序
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  • 将新元素插入到该位置后
  • 重复步骤2~5

代码:

  1. public static void sort(int[] arr) {
  2. int n = arr.length;
  3. for (int i = 1; i < n; ++i) {
  4. int value = arr[i];
  5. int j = 0;//插入的位置
  6. for (j = i-1; j >= 0; j--) {
  7. if (arr[j] > value) {
  8. arr[j+1] = arr[j];//移动数据
  9. } else {
  10. break;
  11. }
  12. }
  13. arr[j+1] = value; //插入数据
  14. }
  15. }

4.希尔排序

在这里插入图片描述

 

希尔排序思路:

  • 基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。
  • 希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。

代码:

  1. public int[] shellSort(int[] A, int n) {
  2. //要插入的纸牌
  3. int temp,j,i;
  4. //设定增量D,增量D/2逐渐减小
  5. for(int D = n/2;D>=1;D=D/2){
  6. //从下标d开始,对d组进行插入排序
  7. for(j=D;j<n;j++){
  8. temp = A[j];
  9. for(i=j;i>=D&&A[i-D]>temp;i-=D){
  10. A[i]=A[i-D];
  11. }
  12. A[i]=temp;
  13. }
  14. }
  15. return A;
  16. }

5.选择排序

每次挑出最小的元素

代码:

  1. public static void sort(int arr[]){
  2. for( int i = 0;i < arr.length ; i++ ){
  3. int min = i;//最小元素的下标
  4. for(int j = i + 1;j < arr.length ; j++ ){
  5. if(arr[j] < arr[min]){
  6. min = j;//找最小值
  7. }
  8. }
  9. //交换位置
  10. int temp = arr[i];
  11. arr[i] = arr[min];
  12. arr[min] = temp;
  13. }
  14. }

6.堆排序

代码:

  1. public int[] heapSort(int[] A, int n) {
  2. //堆排序算法
  3. int i;
  4. //先把A[]数组构建成一个大顶堆。
  5. //从完全二叉树的最下层最右边的非终端结点开始构建。
  6. for(i=n/2-1;i>=0;i--){
  7. HeapAdjust(A,i,n);
  8. }
  9. //开始遍历
  10. for(i=n-1;i>0;i--){
  11. swap(A,0,i);
  12. //每交换一次得到一个最大值然后丢弃
  13. HeapAdjust(A,0,i);
  14. }
  15. return A;
  16. }
  17. //A[i]代表的是下标为i的根结点
  18. private void HeapAdjust(int[] A,int i,int n){
  19. int temp;
  20. temp = A[i];
  21. for(int j=2*i+1;j<n;j=j*2+1){
  22. if(j<n-1&&A[j]<A[j+1]){
  23. ++j;
  24. }
  25. if(temp>=A[j]){
  26. break;
  27. }
  28. //将子节点赋值给根结点
  29. A[i] = A[j];
  30. //将子节点下标赋给i
  31. i = j;
  32. }
  33. //将存储的根结点的值赋给子节点
  34. A[i] = temp;
  35. }
  36. private void swap(int[] A,int i,int j){
  37. int temp = A[i];
  38. A[i]=A[j];
  39. A[j] = temp;
  40. }

7.归并排序

将其分成两路,每路再分两路,依次排序

8.计数排序:速度快,一般用于整数排序

计数排序步骤:

  • 找出待排序的数组中最大和最小的元素
  • 统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项
  • 对所有的计数累加(从 C中的第一个元素开始,每一项和前一项相加)
  • 反向填充目标数组:将每个元素 i 放在新数组的第 C[i] 项,每放一个元素就将 C[i] 减去1

代码:

  1. public static void sort(int[] arr) {
  2. //找出数组中的最大值
  3. int max = arr[0];
  4. for (int i = 1; i < arr.length; i++) {
  5. if (arr[i] > max) {
  6. max = arr[i];
  7. }
  8. }
  9. //初始化计数数组
  10. int[] countArr = new int[max + 1];
  11. //计数
  12. for (int i = 0; i < arr.length; i++) {
  13. countArr[arr[i]]++;
  14. arr[i] = 0;
  15. }
  16. //排序
  17. int index = 0;
  18. for (int i = 0; i < countArr.length; i++) {
  19. if (countArr[i] > 0) {
  20. arr[index++] = i;
  21. }
  22. }
  23. }

9.桶排序

类似于计数排序,将桶分好类,一定范围,再对桶内元素排序

  1. public int[] countingSort(int[] A, int n) {
  2. if(A==null ||n<2){
  3. return A;
  4. }
  5. //找出桶的范围,即通过要排序的数组的最大最小值来确定桶范围
  6. int min=A[0];
  7. int max=A[0];
  8. for(int i=0;i<n;i++){
  9. min=Math.min(A[i],min);
  10. max=Math.max(A[i],max);
  11. }
  12. //确定桶数组,桶的下标即为需排序数组的值,桶的值为序排序数同一组值出现的次数
  13. int[] arr = new int[max-min+1];
  14. //往桶里分配元素
  15. for(int i=0;i<n;i++){
  16. arr[A[i]-min]++;
  17. }
  18. //从桶中取出元素
  19. int index=0;
  20. for(int i=0;i<arr.length;i++){
  21. while(arr[i]-->0){
  22. A[index++]=i+min;
  23. }
  24. }
  25. return A;
  26. }

10.基数排序

基数排序步骤:

  • 取得数组中的最大数,并取得位数;
  • arr为原始数组,从最低位开始取每个位组成radix数组;
  • 对radix进行计数排序(利用计数排序适用于小范围数的特点);

这篇文章对排序解释我认为比较清楚:https://blog.csdn.net/amazing7/article/details/51603682

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/462163
推荐阅读
相关标签
  

闽ICP备14008679号