1. 程式人生 > 其它 >C語言插入排序

C語言插入排序

第一版

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 10
void quick_sort(int arr[], int start, int end);
int partition(int arr[], int low, int high);
void select_sort(int arr[],int n);
void insert_sort(int arr[], int n);
int main() {
    
int i = 0; int arr[N] = {33,9,5,2,5,66,2,1,7,85}; for (int i = 0; i < 10; i++) { printf("%d\t", arr[i]); } printf("\n"); int n = sizeof(arr) / sizeof(arr[0]); insert_sort(arr,n); for (int i = 0; i < 10; i++) { printf("%d\t", arr[i]); } printf(
"\n"); return 0; } //插入排序 /* 這裡的演算法思想是先對前兩個元素排序,然後從第三個元素開始,與前一個元素比較,如果大於前一個元素,則預設有序,如果 小與前一個元素,則一直項前比較,直到找到大於自己的元素,然後將大於自己元素之後的元素一次後移即可。 */ void insert_sort(int arr[],int n) { if (arr[1]<arr[0]) {//這裡首先排序的原因是發現前兩個元素不適用於下面的通式 int temp = arr[1]; arr[1] = arr[0]; arr[0] = temp; }
for (int i = 2; i < n; i++) { int index = i; for (int j = i-1; j >=-1; j--) { if((arr[j]<=arr[i] && arr[i]<arr[i-1]) || (j==-1 && arr[j+1] > arr[i])) {//這裡的第一個條件是通用的,第二個條件是當前元素小於他前面的所有元素的考慮 int temp = arr[i]; while (index>j+1) { arr[index] = arr[index-1]; index--; } arr[j+1] = temp; break; } } } }

改進版

//插入排序
/*
這裡是從前往後找合適的元素,和第一種從後往前匹配相反,因為是按升序排列,在某些情況下,第一種更快速高效
*/
void insert_sort1(int arr[], int n) {
    for (int i = 1; i < n;i++) {
        int j = 0;
        while (arr[j]<arr[i] && j<i) {
            j++;
        }
        if (i!=j) {
            int temp = arr[i];
            for (int k = i; k > j;k--) {
                arr[k] = arr[k - 1];
            }
            arr[j] = temp;
        }
    }
}