文章目录
- 排序算法
- 冒泡排序
- 直接插入排序
- 希尔排序
- 直接选择排序
- 快速排序
- 堆排序
- 归并排序
- 总结
- 查找算法
- 顺序查找
- 二分查找
- 插值查找
- 斐波那契查找
- 树表查找
- 分块查找
- 哈希查找
- 总结
排序算法
冒泡排序
void bubbleSort(int a[] , int n){for(int i = n-1 ; i > 0 ; i--){for(int j = 0 ; j < i ; j++){if(a[j] < a[j - 1]){ swap(a[j - 1],a[j]);printArr(a,n);}}}
}
直接插入排序
void straightInsertionSort(int a[] , int n){int tempCout = 0;//a[j] > a[j + gap]换成a[j] < a[j + 1]for(int i = 1 ; i < n ; i++){ for(int j = i-1 ; j >= 0 && a[j]>a[j+1] ; j-- ){ swap(a[j],a[j+1]); //交换2个数 tempCout++;}printArr(a , n); //打印数字}
}
希尔排序
void shellSort(int a[] , int n){int i ,j , gap; //gap为分组的大小,此处采用二分法for(gap = n/2 ; gap > 0 ; gap /= 2){ //遍历每个分组for(i = gap ; i< n ; i += gap){//将a[j] > a[j + gap]换成a[j] < a[j + gap]for( j = i - gap ; j>=0 && a[j] > a[j + gap] ; j -= gap){ swap(a[j] , a[j + gap]);}printArr(a , n);}}
}
直接选择排序
void straightSelectSort(int a[] , int n){int i , j , minIndex;for(i = 0 ; i < n ; i++){minIndex = i;for(j = i + 1; j < n ; j++){a[j] > a[minIndex]if(a[j] < a[minIndex]){minIndex = j; } }swap(a[i] , a[minIndex]); printArr(a , n); }
}
快速排序
void quickSort(int a[] , int L , int R){if(L < R){int i=L , j = R , temp = a[i];while(i<j){//从右向左找寻小于基准值a[i]的元素while(i<j && a[j] >= temp){j--;} if(i < j){a[i++] = a[j]; //将小于基准值的元素插入到a[i],同时i指针进一 }//从左向右找寻大于基准值a[i]的元素while(i<j && a[i] < temp){i ++;} if(i < j){a[j--] = a[i]; // 将大于基准值的元素插入到a[j] , 同时j指针减一 }}a[i] = temp;quickSort(a , L, i-1); //对左边元素递归 quickSort(a , i+1, R); //对右边元素递归 printArr(a , R - L + 1); //要注意数组的长度是R-L+1而不是R-L,因为数组是从0开始的 }
}
堆排序
归并排序
void mergeArr(int a[] , int left , int mid , int right, int temp[]){int i = left , j = mid + 1; //左边有序的列表 int m = mid , n = right; //右边有序的列表 int k = 0; //用于归并后数组的指引while(i<=m && j<=n){if(a[i] < a[j]){ //比较左边数组和右边数组之间的大小 temp[k++] = a[i++]; //将左边数组小的元素放置于临时数组中,同时数组指针加一 }else{temp[k++] = a[j++]; //将右边数组中小的元素放置于临时数组中,同时数组指针加一 } } //将左边数组中剩下的数组元素加入到temp数组中while(i<=m){temp[k++] = a[i++];//加入元素,同时数组的指针加一 } //将右边的数组中剩下的元素加入到temp数组中while(j<=n){temp[k++] = a[j++];//加入元素,同时数组的指针加一} //将归并后的有序数组复制拷贝到原数组a中 for(i=0;i<k;i++){a[left + i] = temp[i];} printArr(a , right - left + 1);//打印数组
}
void mergeSort(int a[] , int left , int right , int temp[]){if(left < right){int mid = (left + right) / 2 ;mergeSort(a , left , mid , temp); //左边递归mergeSort(a , mid + 1 , right , temp); //右边递归mergeArr(a , left , mid , right , temp);//合并排序好的数组 }
}
总结
查找算法
顺序查找
int SequenceSearch(int a[], int value, int n)
{int i;for(i=0; i<n; i++)if(a[i]==value)return i;return -1;
}
二分查找
int binSearch(int a[] , int val , int len){int start = 0 , mid = 0;int end = len - 1;while(start<=end){mid = (start + end)/2; //计算中点位置if(val == a[mid] ){return mid;}else if(val < a[mid]){end = mid - 1;}else if(val > a[mid]){start = mid + 1;}}return -1;
}int binSearch_1(int a[] , int val , int start , int end){if(start > end){ //查询不到的时候返回-1return -1;}int mid = (end + start) / 2; //计算中点位置if(val == a[mid]){return mid;}else if(val < a[mid]){return binSearch_1(a , val , start , mid - 1);}else if(val > a[mid]){return binSearch_1(a , val , mid + 1 , end);}
}
插值查找
int insertSearch(int a[] , int val , int low , int high){//正常情况下 while(low <= high){int mid = low + (val-a[low])/(a[high]-a[low])*(high-low); //相比于二分查找改进的地方 if(val == a[mid]){return mid;}else if(val < a[mid]){high = mid -1;}else if(val > a[mid]){low = mid + 1;}}return -1;
}
斐波那契查找
树表查找
平衡查找树,二叉查找树,红黑树,b树,b+树,