1 #include <stdio.h>
2 // print the array
3 int printArr(int* arr, int length)
4 {
5 int i = 0;
6 for(i=0;i<length;i++)
7 printf("%d\t",arr[i]);
8 printf("\n");
9 }
10 // swap 2 value
11 void swapValue(int *a, int * b)
12 {
13 int temp = 0;
14 temp = *a;
15 *a = *b;
16 *b = temp;
17 }
18 // check whether the array is sorted
19 int isDone(int * arr, int length)
20 {
21 while(--length>=1)
22 {
23 if(arr[length]>arr[length-1])
24 return 0;
25 }
26 return 1;
27 }
28 // find the biggest value's index
29 int findMaxIndex(int* arr, int length)
30 {
31 int i = 0;
32 int standBy = arr[0];
33 while(length--)
34 {
35 if(standBy < arr[length])
36 {
37 standBy = arr[length];
38 i = length;
39 }
40 }
41 return i;
42 }
43 // reverse the part of the array from the start position
44 int reversePart(int* arr, int start, int length)
45 {
46 int end = length-1;
47 while(start<=end)
48 {
49 swapValue(&arr[start],&arr[end]);
50 start++;
51 end--;
52 }
53 }
54 // core algorithm
55 // 1. find the biggest value's index
56 // 2. check if the index is at the head of the array
57 // true : enter the next loop
58 // false : go to 3 step
59 // 3. check if the index is at the end of the array
60 // true : go to 4 step
61 // false : reverse the part -- get the biggest value to the end of the array
62 // 4. reverse the selected part of the array
63 // 5. check whether the array is sorted
64 // true : break the loop
65 // false : enter the next loop
66 void biscuitSort(int* arr, int length)
67 {
68 int start = 0;
69 int maxIndex = 0;
70 for(start = 0; start < length; start++)
71 {
72 maxIndex = findMaxIndex(arr+start,length-start);
73 if(maxIndex != 0)
74 {
75 if(maxIndex != length-start-1)
76 {
77 reversePart(arr+start,maxIndex,length-start);
78 printArr(arr,length);
79 }
80 reversePart(arr+start,0,length-start);
81 printArr(arr,length);
82 if(isDone(arr,length))
83 break;
84 }
85 }
86 }
87
88 int main()
89 {
90 int arr[]= {7,1,2,5,4};
91 printArr(arr, sizeof(arr)/sizeof(int));
92 biscuitSort(arr, sizeof(arr)/sizeof(int));
93 return 0;
94 }