排序

  1 #include <iostream>  2 using namespace std;
  3 
  4 //插入排序
  5 void insert_sort(int data[],int n)
  6 {
  7     int i, j,tmp;
  8     for (int i = 1; i < n; i++)//进行n-1趟
  9     {
 10         tmp = data[i];
 11         for (j = i; j > 0; j--)
 12         {
 13             if (data[j - 1] > tmp)
 14                 data[j] = data[j - 1];
 15             else
 16                 break;
 17         }
 18         data[j] = tmp;
 19     }
 20 }
 21 //希尔排序
 22 void shell_sort(int data[], int n)
 23 {
 24     int i, j, increment=n/2,tmp;
 25     for(increment=n/2;increment>0;increment/=2)
 26         for (i = increment; i < n; i+=increment)
 27         {
 28             tmp = data[i];
 29             for (j = i; j > 0; j -= increment)
 30             {
 31                 if (data[j - increment] > tmp)
 32                     data[j] = data[j - increment];
 33                 else
 34                     break;
 35             }
 36             data[j] = tmp;
 37         }
 38 }
 39 //堆排序
 40 typedef struct heap_record
 41 {
 42     int capacity;
 43     int size;
 44     int *array;
 45 }*Heap;
 46 Heap initialize(int cap)
 47 {
 48     Heap H=(Heap)malloc(sizeof(heap_record));
 49     if (!H) return NULL;
 50     H->capacity = cap;
 51     H->size = 0;
 52     H->array = (int*)malloc(sizeof(int)*(cap+1));
 53     H->array[0] = -1;//array[0]不用,作为标记
 54     return H;
 55 }
 56 bool isempty(Heap H)
 57 {
 58     return H->size == 0;
 59 }
 60 bool isfull(Heap H)
 61 {
 62     return H->size == H->capacity;
 63 }
 64 void insert(Heap H,int x)
 65 {
 66     int i;
 67     if (isfull(H))
 68         return;
 69     for (i=++H->size; i != 0&&H->array[i / 2] > x;i/=2)
 70         H->array[i] = H->array[i / 2];
 71     H->array[i] = x;
 72 }
 73 int delete_min(Heap H)
 74 {
 75     if (isempty(H))
 76         cout<<"堆为空"<<endl;
 77     int i, child,tmp=H->array[H->size],delete_num=H->array[1];
 78     --H->size;
 79     for (i = 1; 2*i <= H->size; i =child)
 80     {
 81         child = 2*i;
 82         if (child<H->size&&H->array[child+1] < H->array[child ])
 83             child++;
 84         if(tmp>H->array[child])
 85             H->array[i] = H->array[child];
 86         else
 87             break;
 88     }
 89     H->array[i] = tmp;
 90     return delete_num;
 91 }
 92 Heap heap_sort(int data[], int n)
 93 {
 94     Heap H;
 95     int delete_num;
 96     H = initialize(n);
 97     for (int i = 0; i < n; i++)
 98         insert(H, data[i]);//创建堆
 99     for (int i = 0; i < n; i++)
100     {
101         delete_num = delete_min(H);
102         H->array[n - i] = delete_num;
103     }
104     return H;
105 }
106 //归并排序
107 void merge(int A[],int Tmp[],int lpos,int rpos,int rend)//归并操作
108 {//lpos是左边部分的第一个位置,rpos是右边部分的第一个位置,rend是右边的最后的位置
109     int tmpos, lend;
110     tmpos = lpos; lend = rpos - 1;
111     int num = rend - lpos + 1;
112     while (lpos <= lend && rpos <= rend)
113     {
114         if (A[lpos] < A[rpos])
115         {
116             Tmp[tmpos] = A[lpos];
117             tmpos++; lpos++;
118         }
119         else
120         {
121             Tmp[tmpos] = A[rpos];
122             tmpos++; rpos++;
123         }
124     }
125     while (lpos <= lend)
126     {
127         Tmp[tmpos] = A[lpos];
128         lpos++; tmpos++;
129     }
130     while (rpos <= rend)
131     {
132         Tmp[tmpos] = A[rpos];
133         rpos++; tmpos++;
134     }
135     for (int i = 0; i < num; i++)//将排好序的数组拷贝回原来的A数组
136         A[i] = Tmp[i];
137  }
138 void divide(int A[],int Tmp[],int left,int right)
139 {//将数组分成小块排序,用递归实现
140     int center;
141     if (left < right)
142     {
143         center = (left + right) / 2;
144         divide(A, Tmp, left, center);
145         divide(A, Tmp, center + 1, right);
146         merge(A, Tmp, left, center + 1, right);
147     }
148 }
149 void merge_sort(int A[], int n)
150 {
151     int *Tmp;
152     Tmp = (int*)malloc(sizeof(int)*n);
153     divide(A, Tmp, 0, n - 1);
154     free(Tmp);
155 }
156 //快速排序
157 int partition(int A[],int low,int high)
158 {//将大于pivot的元素置于其右边,小于pivot的元素置于其左边
159     int pivotkey;
160     pivotkey = A[low];//用第一个元素做枢纽元
161     while (low < high)
162     {
163         while (low < high&&A[high] >= pivotkey) { high--; }
164         A[low] = A[high];
165         while (low < high&&A[low] <= pivotkey) { low++; }
166         A[high] = A[low];
167     }
168     A[low] = pivotkey;
169     return low;//返回pivot位置
170 }
171 void quick_sort(int A[], int low, int high)
172 {
173     int pivot;
174     if (low < high)//当元素个数大于1时
175     {
176         pivot = partition(A, low, high);
177         quick_sort(A, low, pivot - 1);
178         quick_sort(A, pivot + 1, high);
179     }
180 }
181 //用快速排序解决快速选择问题
182 int quick_select(int A[], int k, int low, int high)
183 {//找出一组数据中第k个最小元
184     int pivot;
185     pivot = partition(A, low, high);
186     if (k - 1 == pivot)//如果枢纽元处的元素恰好是第k个元素,则返回该元素
187         return A[k - 1];
188     if (k - 1 < pivot)//如果第k个位置在枢纽元前面,则在前面的数据中找
189         return quick_select(A, k, low, pivot - 1);
190     if (k - 1 > pivot)//如果第k个位置在枢纽元后面,则在后面的数据中找
191         return quick_select(A, k, pivot + 1, high);
192 }
193 int main()
194 {
195     //插入排序
196     int data0[] = { 34,8,64,51,32,21 };
197     insert_sort(data0, 6);
198     for (int i = 0; i < 6; i++)
199         cout << data0[i] << " ";
200     cout << endl;
201     //希尔排序
202     int data1[] = { 81,94,11,96,12,35,17,95,28,58 };
203     shell_sort(data1, 10);
204     for (int i = 0; i < 10; i++)
205         cout << data1[i] << " ";
206     cout << endl;
207     //堆排序
208     int data2[] = { 32,7,62,49,21,19 };
209     Heap H=heap_sort(data2, 6);
210     for (int i = 6; i > 0; i--)
211         cout << H->array[i] << " ";
212     cout << endl;
213     //归并排序
214     int data3[] = { 13,1,26,24,2,15,38,27 };
215     merge_sort(data3, 8);
216     for (int i = 0; i <8; i++)
217         cout << data3[i] << " ";
218     cout << endl;
219     //快速排序
220     int data4[] = { 49,38,65,97,76,13,27,49 };
221     quick_sort(data4, 0, 7);
222     for (int i = 0; i < 8; i++)
223         cout << data4[i] << " ";
224     cout << endl;
225     int a=quick_select(data4, 1, 0, 7);
226     cout << a << endl;
227     system("pause");
228     return 0;
229 }

运行结果:

 

posted @ 2020-01-28 10:31  江雨牧  阅读(127)  评论(0)    收藏  举报