排序
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 }
运行结果:


浙公网安备 33010602011771号