1. 程式人生 > >直接插入排序(c語言實現)

直接插入排序(c語言實現)

#include <stdio.h>

#define T 1
#define F 0
#define MAXSIZE 10		//要排序陣列個數的最大值

typedef struct
{
	int r[MAXSIZE + 1];	//儲存要排序陣列,r[0]用作哨兵或臨時變數
	int length;
}SqList;

void swap(SqList *L, int i, int j)
{
	int temp = L->r[i];
	L->r[i] = L->r[j];
	L->r[j] = temp;
}

void insertSort(SqList *L)
{
	int i, j;
	for (i = 2; i <= L->length; i++)
	{
		if (L->r[i] < L->r[i-1])		//需將L->r[i]插入到有序子表,即後一個小於前一個才需要插入
		{
			L->r[0] = L->r[i];			//設定哨兵,即將要插入的值賦值給一個臨時變數,並且使之與之前有序的子表做比較
			for (j = i-1; L->r[j] > L->r[0]; j--)	//每次都從當前值的前一個位置開始遍歷
			{										//迴圈結束的條件:1、找到一個比哨兵小的值 2、j=0即r[j]==r[0]
				L->r[j+1] = L->r[j];	//比其大的,即比哨兵大的都後移
			}
			L->r[j+1] = L->r[0];		//將其插入到正確位置,因為j多減了一次1 所以是j+1
		}
	}
}

int main()
{
	int i;
	SqList L;
	L.length = 10;
	for (i = 1; i < L.length+1; i++)
	{
		L.r[i] = i;
	}
	L.r[5] = 100;
	L.r[7] = 90;
	for (i = 1; i < L.length+1; i++)
	{
		printf("%d ", L.r[i]);
	}		
	insertSort(&L);
	printf("\n");
	for (i = 1; i < L.length+1; i++)
	{
		printf("%d ", L.r[i]);
	}
	printf("\n");
	return 0;
}

相關推薦

直接插入排序c語言實現

#include <stdio.h> #define T 1 #define F 0 #define MAXSIZE 10 //要排序陣列個數的最大值 typedef struct {

資料結構排序的實驗四快速,冒泡,簡單選擇,直接插入排序c語言實現!!

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18p

八大排序演算法之一直接插入排序C語言

概述 排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 我們這裡說說八大排序就是內部排序。     當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快

排序C語言實現

names 博客 鏈接 c語言實現 建立 ron 要求 clas [1] 之前的博客介紹介紹了數組的兩種排序算法:插入排序和歸並排序(採用遞歸),見鏈接http://blog.csdn.net/u013165521/article/detai

歸並排序C語言實現

ngs 基本 merge 兩個 它的 efi 分別是 void rec 合並排序(MERGE SORT)是又一類不同的排序方法,合並的含義就是將兩個或兩個以上的有序數據序列合並成一個新的有序數據序列,因此它又叫歸並算法。 它的基本思想就是假

排序C語言實現

內部排序 利用 int 分治 arr 個數 size quic 外部排序 讀數據結構與算法分析 插入排序 核心:利用的是從位置0到位置P都是已排序的 所以從位置1開始排序,如果當前位置不對,則和前面元素反復交換重新排序 實現 void InsertionSort

有趣的演算法:3分鐘看懂希爾排序C語言實現

在上一次的演算法討論中,我們一起學習了直接插入排序。它的原理就是把前i個長度的序列變成有序序列,然後迴圈迭代,直至整個序列都變為有序的。但是說來說去它還是一個時間複雜度為(n^2)的演算法,難道就不能再進一步把時間複雜度降低一階麼?確實,以上幾種演算法相對於之前的O(n^2)

資料結構排序演算法之歸併排序c語言實現

博主身為大二萌新,第一次學習資料結構,自學到排序的時候,對於書上各種各樣的排序演算法頓覺眼花繚亂,便花了很長的時間盡力把每一個演算法都看懂,但限於水平有限,可能還是理解較淺,於是便將它們逐個地整理實現出來,以便加深理解。 歸併排序就是通過將一個具有n個key記錄的線性表,看

帶頭節點連結串列之插入排序C語言

主要是對插入排序進行復習,先寫一個數組的插入排序。 #include <stdio.h> void traverse(int *arr, int len); void insert_sort(int *arr, int len); int ma

排序演算法-合併排序C語言實現

都說“演算法是程式的靈魂”,而排序是計算機儲存控制方面不能沒有的操作。它在資料的存取,查詢搜尋,資料統計這些基礎資料操作方面有著重要的應用。所以排序演算法是必須是很有研究的。 這次,我學習的是-歸併排序演算法。據說該演算法是馮諾依曼發明的。這個排序演算法比起直

氣泡排序c語言實現

#include <stdio.h> #define T 1 #define F 0 #define MAXSIZE 10 //要排序陣列個數的最大值 typedef struct {

快速排序c語言實現

#include <stdio.h> #define T 1 #define F 0 #define MAXSIZE 10 //要排序陣列個數的最大值 typedef struct {

拓撲排序C語言實現

拓撲排序可以將一個有向無環圖轉換為一個線性序列。它也是判定一個有向圖是否是無環的方法之一。如何進行拓撲排序,方法如下: (1)從有向圖中選取一個沒有前驅(入度為0)的頂點,並輸出之; (2)從有向圖中刪去此頂點以及所有以它為尾的弧(弧頭頂點的入度減1); 重複

資料結構 簡單選擇排序C語言實現

       選擇排序的基本思想:每一趟在n-i+1(i=1,2,3,…,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。 演算法思想       第一趟簡單選擇排序時,從第一個記錄開始,通過n-1 次關鍵字比較,從n 個記錄中選出關鍵字最小的記錄,並和第

資料結構排序演算法之快速排序c語言實現

快排的原理就是通過一趟排序將待排記錄分割成獨立的兩部分,其中的一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。這其中,可以使用遞迴呼叫某一關鍵函式的辦法來實現這樣的功能。 分割的方法就是,選取一個樞軸,將所有關鍵字比它

直接插入排序C語言實現

插入法排序:通過資料移動,留出合適位置插入順序合適的值,而無須資料交換 步驟:從第二個元素“i”開始快取準備用於比較,並留出一個空位將空位前的元素“j”拿來與快取值比較不滿足則移動,直到向前找到頭比較的目的是要讓快取值插入後成為從開頭到插入點這個區間中的最值如果快取值向前看

直接插入排序高級版C++實現

include ostream 源代碼 cpp -s 臨時 ios 結束 中間變量 直接插入排序(高級版)之C++實現 一、源代碼:InsertSortHigh.cpp 1 /*直接插入排序思想: 2  假設待排序的記錄存放在數組R[1..n]中。初始時,R[1]自成

直接插入排序Straight Insertion Sort- java實現

學習自嚴蔚敏、吳偉民的《資料結構》-清華大學出版 最簡單的排序方法。基本操作是將一個記錄插入到已排序好的有序表中,從而得到一個新的、記錄數增1的有序表。 先看程式碼: public static int[] insertSort(int[] arr) { for

資料結構之二叉排序C語言實現

一、基本概念1.二叉排序樹        二叉排序樹(Binary sort tree,BST),又稱為二叉查詢樹,或者是一棵空樹;或者是具有下列性質的二叉樹:        (1)若它的左子樹不為空,則左子樹上所有節點的值均小於它的根節點的值;        (2)若它的右