淺談2路插入排序算法及其簡單實現
更新時間:2015年08月12日 11:32:40 作者:zinss26914
這篇文章主要介紹了淺談2路插入排序算法及其簡單實現,雖算不上是常用的排序方法,但在數據庫等方面依然有用上的機會,需要的朋友可以參考下
2路插入排序算法是在直接插入排序算法的基礎上增加了一個輔助數組,其目的是減少排序過程中的移動次數,需要增加n個記錄的輔助空間。
難點可能在于對取余的考慮吧,可以把輔助數組看成一個環(huán)狀空間,這樣就能更好的理解輔助空間中最大值和最小值的位置了。
算法整體思想還是很簡單的,直接貼出可運行代碼,注釋還是挺清楚的,大家直接看就ok了
C語言實現示例
#include <stdio.h> #include <stdlib.h> void insert_sort(int *arr, int *temp, int n) { int i, first, final, k; first = final = 0; temp[0] = arr[0]; for (i = 1; i < n; i ++) { if (arr[i] < temp[first]) { // 待插入元素比最小的元素小 first = (first - 1 + n) % n; temp[first] = arr[i]; } else if (arr[i] > temp[final]) { // 待插入元素比最大元素大 final = (final + 1 + n) % n; temp[final] = arr[i]; } else { // 插入元素比最小大,比最大小 k = (final + 1 + n) % n; while (temp[((k - 1) + n) % n] > arr[i]) { temp[(k + n) % n] =temp[(k - 1 + n) % n]; k = (k - 1 + n) % n; } temp[(k + n) % n] = arr[i]; final = (fianl + 1 + n) % n; } } // 將排序記錄復制到原來的順序表里 for (k = 0; k < n; k ++) { arr[k] = temp[(first + k) % n]; } } int main(void) { int i, n, *arr, *temp; while (scanf("%d", &n) != EOF) { arr = (int *)malloc(sizeof(arr) * n); temp = (int *)malloc(sizeof(temp) * n); for (i = 0; i < n; i ++) scanf("%d", &arr[i]); insert_sort(arr, temp, n); for (i = 0; i < n; i ++) printf("%d ", arr[i]); printf("\n"); free(arr); free(temp); } return 0; }
同時附上C++寫法:
#include<iostream> using namespace std; #define MAX 20 void PrintArray(int a[],int len){ for(int i=0;i<len;i++) cout<<a[i]<<" "; cout<<endl; } void BinInsertSort(int a[],int len){ int *d=(int *)malloc(len*sizeof(len)); for(int i=0;i<len;i++) d[i]=0; int first=0,final=0; d[0]=a[0]; for(int i=1;i<len;i++){ if(a[i]<=d[first]){ first=(first-1+len)%len; d[first]=a[i]; } else if(a[i]>=d[final]){ final=final+1; d[final]=a[i]; } else{ int j=final++; while(a[i]<d[j]){ d[(j+1)%len]=d[j]; j=(j-1+len)%len; } d[j+1]=a[i]; } } cout<<"輔助數組中排序結果為:"; PrintArray(d,len); } int main(){ int a[MAX],len; cout<<"請輸入待排序的元素個數:"; cin>>len; cout<<"請輸入待排序的元素:"; for(int i=0;i<len;i++) cin>>a[i]; BinInsertSort(a,len); system("pause"); return 0; }
相關文章
C語言之棧和堆(Stack && Heap)的優(yōu)缺點及其使用區(qū)別
本篇文章主要介紹了什么是棧(Stack) 、什么是堆( Heap),以及棧和堆的優(yōu)缺點,同時介紹了應該什么時候使用堆和棧,有需要的朋友可以參考下2015-07-07