首页 > 代码库 > 排序算法
排序算法
C语言实现:
#include <iostream>#include <map>#include <vector>//冒泡排序void buttle(int array[], int len){ int temp; for(int i = 0; i < len; i++) { for(int j = 0; j < len-1 -i; j++) { if(array[j] > array[j+1]) { temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } }}//简单选择排序void select(int array[], int len){ int min_index; int temp; for(int i = 0; i < len; i++) { min_index = i; for(int j = i+1; j < len; j++) { if(array[j] < array[min_index]) { min_index = j; } } if(min_index != i) { temp = array[i]; array[i] = array[min_index]; array[min_index] = temp; } }}//直接插入排序void insert(int array[], int len){ int temp; //从第二个元素开始 for(int i = 1; i < len; i++) { for(int j = i; j >= 1; j--) { if(array[j] < array[j-1]) { temp = array[j]; array[j] = array[j-1]; array[j-1] = temp; } } }}//希尔排序void shell(int array[],int len){ int increment = len/2; int temp; while(increment >= 1) { for(int i = increment; i < len; i++) { temp = array[i]; int j = i - increment; while(j >= 0 && array[j] < temp) { array[j+increment] = array[j]; j = j - increment; } array[j+increment] = temp; } increment /= 2; }}//希尔排序void shell2(int array[], int len) { int increment = len/2; int temp; while(increment >= 1) { std::cout<<"increment:"<<increment<<std::endl; for(int i = 0; i < len - increment; i++) { for(int j = i; j < len - increment; j=j+increment) { if(array[j] > array[j+increment]) { temp = array[j]; array[j] = array[j+increment]; array[j+increment] = temp; } } } increment /= 2; }}//计数排序void count(int array[], int len){ std::map<int, std::vector<int> > m; for(int i = 0; i < len; i++) { int num = array[i]; if(m.find(num) != m.end()) { m[num].push_back(num); } else { std::vector<int> vect; vect.push_back(num); m[num] = vect; } } std::map<int, std::vector<int> >::iterator it = m.begin(); int index = 0; while(it != m.end()) { for(int i = 0; i < it->second.size(); i++) { array[index] = it->second[i]; index++; } it++; }}//堆排序——构建二叉堆void build_tree1(int array[], int index, int num) //i表示中间节点在原数组中的索引,num表示需要参与建堆的节点个数{ int i; int left_child_index = 2*index+1; int right_child_index = 2*index+2; //有左孩子 if(left_child_index < num) { if(array[left_child_index] > array[index]) { int temp = array[index]; array[index] = array[left_child_index]; array[left_child_index] = temp; build_tree1(array, left_child_index, num); } } //有右孩子 if(right_child_index < num) { if(array[right_child_index] > array[index]) { int temp = array[index]; array[index] = array[right_child_index]; array[right_child_index] = temp; build_tree1(array, right_child_index, num); } } return;}//堆排序——构建二叉堆void build_tree2(int array[], int index, int num) //i表示中间节点在原数组中的索引,num表示需要参与建堆的节点个数{ int i; int left_child_index = 2*index+1; int right_child_index = 2*index+2; if(right_child_index < num) //右孩子存在的话,左孩子必定存在 { //同时有左右孩子 if(array[left_child_index] > array[index] || array[right_child_index] > array[index]) { int bigger_child_index = left_child_index; if(array[left_child_index] < array[right_child_index]) { bigger_child_index = right_child_index; } int temp = array[index]; array[index] = array[bigger_child_index]; array[bigger_child_index] = temp; build_tree2(array, bigger_child_index, num); } } else if (left_child_index < num) { //只有左孩子 if(array[left_child_index] > array[index]) { int temp = array[index]; array[index] = array[left_child_index]; array[left_child_index] = temp; build_tree2(array, left_child_index, num); } } return;}//堆排序void heat(int array[], int len){ for(int i = len/2; i >= 0; i--) { build_tree2(array, i, len); } for(int i = len -1; i > 0; i--) { int temp = array[i]; array[i] = array[0]; array[0] = temp; build_tree2(array, 0, i); }}//归并排序void merge_join(int left_child_array[], int left_child_array_len, int right_child_array[], int right_child_array_len, int *temp){ int left_cur_index = 0; int right_cur_index = 0; int temp_cur_index = 0; //如果两个子数组都有数据 while(left_cur_index < left_child_array_len && right_cur_index < right_child_array_len) { if(left_child_array[left_cur_index] <= right_child_array[right_cur_index]) { temp[temp_cur_index] = left_child_array[left_cur_index]; left_cur_index++; temp_cur_index++; } else { temp[temp_cur_index] = right_child_array[right_cur_index]; right_cur_index++; temp_cur_index++; } } //如果只有其中一个数组有数据,直接把该数组数据全部加到排序数组后面好了 while(left_cur_index < left_child_array_len) { temp[temp_cur_index] = left_child_array[left_cur_index]; left_cur_index++; temp_cur_index++; } while(right_cur_index < right_child_array_len) { temp[temp_cur_index] = right_child_array[right_cur_index]; right_cur_index++; temp_cur_index++; } std::cout<<"--------------\n"; for(int i = 0; i < left_child_array_len + right_child_array_len; i++) { std::cout<<"i:"<<temp[i]<<std::endl; left_child_array[i] = temp[i]; } std::cout<<"--------------\n";}//归并排序void begin_merge(int array[], int len, int *temp){ if(len > 1) { int left_child_array_len = len/2; int right_child_array_len = len - left_child_array_len; int *left_child_array = array; int *right_child_array = array + left_child_array_len; //拆分左子树 begin_merge(left_child_array, left_child_array_len, temp); //拆分右子树 begin_merge(right_child_array, right_child_array_len, temp); //归并排序 merge_join(left_child_array, left_child_array_len, right_child_array, right_child_array_len, temp); }}//归并排序void merge(int array[], int len){ int *temp = (int*)malloc(len * sizeof(int)); begin_merge(array, len, temp); /* for(int i = 0; i < len; i++) { std::cout<<"i:"<<temp[i]<<std::endl; } */ //array = temp;}int sorted_pivot(int array[], int len){ int pivot_index = 0; int pivot_num = array[pivot_index]; std::cout<<"pivot_num:"<<pivot_num<<std::endl; int left_index = 0; int right_index = len -1; while(left_index < right_index) { while(1) { if(array[right_index] < pivot_num || left_index >= right_index) { break; } right_index--; std::cout<<"right_index:"<<right_index<<std::endl; } while(1) { if(array[left_index] > pivot_num || left_index >= right_index) { break; } left_index++; std::cout<<"left_index:"<<left_index<<std::endl; } //交换两个值 int temp = array[left_index]; array[left_index] = array[right_index]; array[right_index] = array[left_index]; } //将基准数归位 array[pivot_index] = array[left_index]; array[left_index] = pivot_num; return left_index;}//快速排序void quick1(int array[], int len){ if(len < 2) { return; } int pivot = sorted_pivot(array, len); quick1(array, pivot+1); quick1(array + pivot + 1 , len - pivot +1);}int main(){ int arr[25] = {5,2,3,4,1,8,9,0,7,6,10,19,15,13,17,18,14,12,11,16,30,35,310,315,335}; quick1(arr,25); for(int i = 0; i < 25; i++) { std::cout<<arr[i]<<std::endl; }}
排序算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。