数据结构-排序(插入排序)
1.直接插入排序算法
1 // 直接插入排序
2 //Code by Larman Yuan 2009-6-28
3
4 #include "stdafx.h"
5
6 void insertSort(int * sortArray, int size)
7 {
8 int j;
9 for(int i = 1; i < size; i++)
10 {
11 j = i - 1;
12 int temp = sortArray[i];
13 while(sortArray[j] > temp && j >= 0)
14 {
15 sortArray[j + 1] = sortArray[j];
16 j--;
17 }
18 if(j != (i - 1))
19 sortArray[j + 1] = temp;
20
21 }
22 }
23
24 void printArray(int arrayToPrint[],int size)
25 {
26 for(int i = 0; i < size; i++)
27 {
28 printf("%d ", arrayToPrint[i]);
29 }
30 printf("\n");
31 }
32 int _tmain(int argc, _TCHAR* argv[])
33 {
34 int sortArray[8] = {49, 38, 65, 97,76, 13, 27, 49};
35 printf("Array before sort: ");
36 printArray(sortArray, 8);
37 insertSort(sortArray, 8);
38 printf("Array after sort : ");
39 printArray(sortArray, 8);
40 return 0;
41 }
2 //Code by Larman Yuan 2009-6-28
3
4 #include "stdafx.h"
5
6 void insertSort(int * sortArray, int size)
7 {
8 int j;
9 for(int i = 1; i < size; i++)
10 {
11 j = i - 1;
12 int temp = sortArray[i];
13 while(sortArray[j] > temp && j >= 0)
14 {
15 sortArray[j + 1] = sortArray[j];
16 j--;
17 }
18 if(j != (i - 1))
19 sortArray[j + 1] = temp;
20
21 }
22 }
23
24 void printArray(int arrayToPrint[],int size)
25 {
26 for(int i = 0; i < size; i++)
27 {
28 printf("%d ", arrayToPrint[i]);
29 }
30 printf("\n");
31 }
32 int _tmain(int argc, _TCHAR* argv[])
33 {
34 int sortArray[8] = {49, 38, 65, 97,76, 13, 27, 49};
35 printf("Array before sort: ");
36 printArray(sortArray, 8);
37 insertSort(sortArray, 8);
38 printf("Array after sort : ");
39 printArray(sortArray, 8);
40 return 0;
41 }
运行结果:
Array before sort: 49 38 65 97 76 13 27 49
Array after sort : 13 27 38 49 49 65 76 97
2.二分插入排序算法
1 // 二分法插入排序
2 //Code by Larman Yuan 2009-6-28
3
4 #include "stdafx.h"
5
6 void binInsertSort(int* sortArray, int size)
7 {
8 int left, right,middle, i,j, temp;
9 for(i = 1; i < size; i++)
10 {
11 temp = sortArray[i];
12 left = 0;
13 right = i - 1;
14
15 while(left <= right)
16 {
17 middle = (left + right) / 2;
18 if(temp < sortArray[middle])
19 right = middle -1;
20 else
21 left = middle + 1;
22 }
23
24 for(j = i - 1; j >= left; j--)
25 sortArray[j + 1] = sortArray[j];
26 if(left != i)
27 sortArray[left] = temp;
28 }
29 }
30
31 void printArray(int arrayToPrint[],int size)
32 {
33 for(int i = 0; i < size; i++)
34 {
35 printf("%d ", arrayToPrint[i]);
36 }
37 printf("\n");
38 }
39
40 int _tmain(int argc, _TCHAR* argv[])
41 {
42 int sortArray[8] = {49, 38, 65, 97,76, 13, 27, 49};
43 printf("Array before sort: ");
44 printArray(sortArray, 8);
45 binInsertSort(sortArray, 8);
46 printf("Array after sort : ");
47 printArray(sortArray, 8);
48 return 0;
49 }
2 //Code by Larman Yuan 2009-6-28
3
4 #include "stdafx.h"
5
6 void binInsertSort(int* sortArray, int size)
7 {
8 int left, right,middle, i,j, temp;
9 for(i = 1; i < size; i++)
10 {
11 temp = sortArray[i];
12 left = 0;
13 right = i - 1;
14
15 while(left <= right)
16 {
17 middle = (left + right) / 2;
18 if(temp < sortArray[middle])
19 right = middle -1;
20 else
21 left = middle + 1;
22 }
23
24 for(j = i - 1; j >= left; j--)
25 sortArray[j + 1] = sortArray[j];
26 if(left != i)
27 sortArray[left] = temp;
28 }
29 }
30
31 void printArray(int arrayToPrint[],int size)
32 {
33 for(int i = 0; i < size; i++)
34 {
35 printf("%d ", arrayToPrint[i]);
36 }
37 printf("\n");
38 }
39
40 int _tmain(int argc, _TCHAR* argv[])
41 {
42 int sortArray[8] = {49, 38, 65, 97,76, 13, 27, 49};
43 printf("Array before sort: ");
44 printArray(sortArray, 8);
45 binInsertSort(sortArray, 8);
46 printf("Array after sort : ");
47 printArray(sortArray, 8);
48 return 0;
49 }
运行结果:
Array before sort: 49 38 65 97 76 13 27 49
Array after sort : 13 27 38 49 49 65 76 97
3.表插入排序算法
1 // 表插入排序
2 //Code by larman Yuan 2009-6-28
3
4 #include "stdafx.h"
5 #include <stdlib.h>
6 struct Node;
7 typedef struct Node ListNode;
8 struct Node
9 {
10 int key;
11 ListNode* next;
12 };
13 typedef ListNode* LinkList;
14
15 void listInsertSort(LinkList * palist)
16 {
17 ListNode * now, *pre, *p, *q, *head;
18 head = *palist;
19 pre = head ->next;
20 now = pre->next;
21 if(pre == NULL || now == NULL)
22 {
23 return;
24 }
25 while(now != NULL)
26 {
27 q = head;
28 p = head->next;
29 while(p != now && p->key <= now->key)
30 {
31 q = p;
32 p = p->next;
33 }
34 if(p == now)
35 {
36 pre = pre->next;
37 now = pre->next;
38 continue;
39 }
40 pre->next = now->next;
41 q->next = now;
42 now->next = p;
43 now = pre->next;
44 }
45 }
46
47 void printList(LinkList * palist)
48 {
49 ListNode * p = (*palist)->next;
50 while(p != NULL)
51 {
52 printf("%d ",p->key);
53 p = p->next;
54 }
55 printf("\n");
56 }
57
58 void insertElement(LinkList * palist, int value)
59 {
60 ListNode * head, *p, * nodeToInsert;
61 if(palist == NULL || *palist == NULL)
62 {
63 return;
64 }
65 head = *palist;
66 p = head;
67 while(p->next != NULL)
68 {
69 p = p->next;
70 }
71 nodeToInsert = (ListNode *)malloc(sizeof(struct Node));
72 nodeToInsert->key = value;
73 nodeToInsert->next = NULL;
74 p->next = nodeToInsert;
75 }
76 int _tmain(int argc, _TCHAR* argv[])
77 {
78 LinkList list = (ListNode *)malloc(sizeof(struct Node));
79 list->next = NULL;
80 insertElement(&list,49);
81 insertElement(&list,38);
82 insertElement(&list,65);
83 insertElement(&list,97);
84 insertElement(&list,76);
85 insertElement(&list,13);
86 insertElement(&list,27);
87 insertElement(&list,49);
88 printf("List before sort: ");
89 printList(&list);
90 listInsertSort(&list);
91 printf("List after sort: ");
92 printList(&list);
93 return 0;
94 }
2 //Code by larman Yuan 2009-6-28
3
4 #include "stdafx.h"
5 #include <stdlib.h>
6 struct Node;
7 typedef struct Node ListNode;
8 struct Node
9 {
10 int key;
11 ListNode* next;
12 };
13 typedef ListNode* LinkList;
14
15 void listInsertSort(LinkList * palist)
16 {
17 ListNode * now, *pre, *p, *q, *head;
18 head = *palist;
19 pre = head ->next;
20 now = pre->next;
21 if(pre == NULL || now == NULL)
22 {
23 return;
24 }
25 while(now != NULL)
26 {
27 q = head;
28 p = head->next;
29 while(p != now && p->key <= now->key)
30 {
31 q = p;
32 p = p->next;
33 }
34 if(p == now)
35 {
36 pre = pre->next;
37 now = pre->next;
38 continue;
39 }
40 pre->next = now->next;
41 q->next = now;
42 now->next = p;
43 now = pre->next;
44 }
45 }
46
47 void printList(LinkList * palist)
48 {
49 ListNode * p = (*palist)->next;
50 while(p != NULL)
51 {
52 printf("%d ",p->key);
53 p = p->next;
54 }
55 printf("\n");
56 }
57
58 void insertElement(LinkList * palist, int value)
59 {
60 ListNode * head, *p, * nodeToInsert;
61 if(palist == NULL || *palist == NULL)
62 {
63 return;
64 }
65 head = *palist;
66 p = head;
67 while(p->next != NULL)
68 {
69 p = p->next;
70 }
71 nodeToInsert = (ListNode *)malloc(sizeof(struct Node));
72 nodeToInsert->key = value;
73 nodeToInsert->next = NULL;
74 p->next = nodeToInsert;
75 }
76 int _tmain(int argc, _TCHAR* argv[])
77 {
78 LinkList list = (ListNode *)malloc(sizeof(struct Node));
79 list->next = NULL;
80 insertElement(&list,49);
81 insertElement(&list,38);
82 insertElement(&list,65);
83 insertElement(&list,97);
84 insertElement(&list,76);
85 insertElement(&list,13);
86 insertElement(&list,27);
87 insertElement(&list,49);
88 printf("List before sort: ");
89 printList(&list);
90 listInsertSort(&list);
91 printf("List after sort: ");
92 printList(&list);
93 return 0;
94 }
运行结果:
List before sort: 49 38 65 97 76 13 27 49
List after sort: 13 27 38 49 49 65 76 97
4.Shell排序算法
1 // shellSort.cpp: 主项目文件。
2
3 #include "stdafx.h"
4 #include <stdio.h>
5
6 using namespace System;
7
8 void shellSort(int* sortArray, int size,int d)
9 {
10 int i, j, increment, temp;
11 for(increment = d; increment > 0; increment /= 2)
12 {
13 for(i = increment; i < size; i++)
14 {
15 temp = sortArray[i];
16 j = i - increment;
17 while(j >= 0 && temp < sortArray[j])
18 {
19 sortArray[j + increment] = sortArray[j];
20 j -= increment;
21 }
22 sortArray[j + increment] = temp;
23 }
24 }
25 }
26
27 void printArray(int arrayToPrint[],int size)
28 {
29 for(int i = 0; i < size; i++)
30 {
31 printf("%d ", arrayToPrint[i]);
32 }
33 printf("\n");
34 }
35
36 int main(array<System::String ^> ^args)
37 {
38 int sortArray[8] = {49,38,65,97,13,76,27,49};
39 printf("Array before sort: ");
40 printArray(sortArray, 8);
41 shellSort(sortArray, 8, 4);
42 printf("Array after sort: ");
43 printArray(sortArray, 8);
44 return 0;
45 }
2
3 #include "stdafx.h"
4 #include <stdio.h>
5
6 using namespace System;
7
8 void shellSort(int* sortArray, int size,int d)
9 {
10 int i, j, increment, temp;
11 for(increment = d; increment > 0; increment /= 2)
12 {
13 for(i = increment; i < size; i++)
14 {
15 temp = sortArray[i];
16 j = i - increment;
17 while(j >= 0 && temp < sortArray[j])
18 {
19 sortArray[j + increment] = sortArray[j];
20 j -= increment;
21 }
22 sortArray[j + increment] = temp;
23 }
24 }
25 }
26
27 void printArray(int arrayToPrint[],int size)
28 {
29 for(int i = 0; i < size; i++)
30 {
31 printf("%d ", arrayToPrint[i]);
32 }
33 printf("\n");
34 }
35
36 int main(array<System::String ^> ^args)
37 {
38 int sortArray[8] = {49,38,65,97,13,76,27,49};
39 printf("Array before sort: ");
40 printArray(sortArray, 8);
41 shellSort(sortArray, 8, 4);
42 printf("Array after sort: ");
43 printArray(sortArray, 8);
44 return 0;
45 }
运行结果:
Array before sort: 49 38 65 97 13 76 27 49
Array after sort: 13 27 38 49 49 65 76 97