篇十一:直接插入排序

插入排序的基本思想:

        每次将一个待排序的元素,按其关键字的大小插入到前面已经排好序的子文件的适当位置,直到全部记录插入插入完成为止。

        直接插入排序的思想:

        把n个待排序的元素看成是一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含n-1个元素,排序过程中,每次从无序表取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使其成为新的有序表。

/** 直接插入排序
 * @author xiaocui
 * @date 2022年08月05日 17:58
 */
public class InsertSort {

    private static void insertSort(int[] arr) {
        for (int i = 0; i < arr.length-1; ++i) {
            //记录有序序列最后一个元素的下标
            int end = i;
            //待插入的元素
            int term = arr[end+1];
            //单趟排
            while (end >= 0){
                //比插入的数大就向后移
                if (term < arr[end]){
                    arr[end+1]=arr[end];
                    end--;
                }else //比插入的数小,跳出循环
                    break;
            }
            //tem放到比插入的数小的数的后面
            arr[end+1]=term;//把当前遍历元素放入到合适的位置上

            //代码执行到此位置有两种情况:
            //1.待插入元素找到应插入位置(break跳出循环到此)
            //2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
        }
    }

    public static void main(String[] args) {
        int[] arr = {17,3,25,14,20,9};
        insertSort(arr);
        for (int i:arr) {
            System.out.print(i + "    ");
        }
    }
}

结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你的问题,并为你提供这些算法的C语言实现。 1. 直接插入排序: ```c void insertionSort(int arr[], int n) { int i, j, key; for (i = 1; i < n; i++) { key = arr[i]; j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } ``` 2. 折半插入排序: ```c void binaryInsertionSort(int arr[], int n) { int i, j, key, low, high, mid; for (i = 1; i < n; i++) { key = arr[i]; low = 0; high = i - 1; while (low <= high) { mid = (low + high) / 2; if (key < arr[mid]) high = mid - 1; else low = mid + 1; } for (j = i - 1; j >= low; j--) arr[j + 1] = arr[j]; arr[low] = key; } } ``` 3. 冒泡排序: ```c void bubbleSort(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 4. 快速排序: ```c void quickSort(int arr[], int low, int high) { int i, j, pivot, temp; if (low < high) { pivot = low; i = low; j = high; while (i < j) { while (arr[i] <= arr[pivot] && i < high) i++; while (arr[j] > arr[pivot]) j--; if (i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } temp = arr[pivot]; arr[pivot] = arr[j]; arr[j] = temp; quickSort(arr, low, j - 1); quickSort(arr, j + 1, high); } } ``` 5. 简单选择排序: ```c void selectionSort(int arr[], int n) { int i, j, min_idx, temp; for (i = 0; i < n - 1; i++) { min_idx = i; for (j = i + 1; j < n; j++) { if (arr[j] < arr[min_idx]) min_idx = j; } temp = arr[min_idx]; arr[min_idx] = arr[i]; arr[i] = temp; } } ``` 希望这些代码能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值