蛋疼的回忆一下算法
#include <iostream>
#define len(x) (unsigned int)sizeof(x)/sizeof(x[0])
using namespace std;
void Swap(int x[],int i,int j){
int tem = x[i];
x[i] = x[j];
x[j] = tem;
}
void print(int x[],int length){
for(int i = 0; i < length; i++){
cout << x[i] << "\t";
}
cout <<endl;
}
void bubbleSort(int r[],int length){
bool flag = true;
for(int i = 0; i < length-1 && flag; i++){
flag = false;
for(int j = 0; j < length - i-1;j++){
if(r[j] < r[j+1]) {
Swap(r,j,j+1);
flag = true;
}
}
}
}
void bubbleSort1(int r[],int length){
for(int i = 0; i < length - 1; i++){
for(int j = length - 1; j > i ; j--){
if(r[j] > r[j-1]){
Swap(r,j,j-1);
}
}
}
}
void selectSort(int r[],int length){
for(int i = 0; i < length-1; i++){
int _min = i;
for(int j = i+1; j < length; j ++){
if(r[j] < r[_min]) _min = j;
}
Swap(r,_min,i);
}
}
void insertSort(int r[],int length){
int _trans = 0;
for(int i = 0; i < length - 1; i++){
if(r[i] > r[i+1]){
_trans = r[i+1];
int k = i;
while(r[k] > _trans && k >= 0){//这里是为了防止r[k]乱值导致错误k的索引
r[k+1] = r[k];
k--;
}
r[k+1] = _trans;
}
}
}
void shellSort(int r[],int length){
int increment = length/2;
while(increment >= 1){
for(int i = increment; i < length ; i++){
int j = i-increment;
int key = r[i];
while(j >=0 && r[j] > key){
r[j+increment] = r[j];
j = j-increment;
}
r[j+increment] = key;
}
increment = increment/2;
}
}
int Partition(int r[],int low,int high){
int value = r[low];
while(low < high){
while(low < high && r[high] >= value) high--;
Swap(r,low,high);
while(r[low] <= value && low < high) low++;
Swap(r,low,high);
}
return low;
}
int Partition1(int r[],int low,int high){
int value = r[high];
while(low<high){
while(low<high && r[low] <= value) low++;
Swap(r,low,high);
while(low<high && r[high] >= value) high--;
Swap(r,low,high);
}
return high;
}
void quickSort(int r[],int low, int high){
int pivot;
if(low < high){
pivot = Partition(r,low,high);
quickSort(r,low,pivot-1);
quickSort(r,pivot+1,high);
}
}
/*
//void stepSort(int r[],int length){
// int step = length/2;
// while(step>=1){
// for(int i = 0; i < step; i++){
// for(int j = i; j < length; j +=step){
// cout << j << "\t";
// int key = r[j];
// int k = j;
// if(k-step>=0 && r[k-step] > key){
// cout << r[k] <<"->" << r[k-step];
// r[k] = r[k-step];
// k-=step;
// }
// r[k] = key;
// }
// cout <<endl;
// }
// step/=2;
// }
//}
*/
void myShellSort(int r[],int length){
int step = length/2;
while(step>=1){
for(int i = 0; i < step; i++){
for(int j = i; j < length; j +=step){
cout << j << "\t";
int key = r[j];
int k = j;
while(k-step>=0 && r[k-step] > key){
cout << r[k] <<"->" << r[k-step];
r[k] = r[k-step];
k-=step;
}
r[k] = key;
}
cout <<endl;
}
step/=2;
}
}
int main()
{
int r[] = {6,2,7,3,4,8,1,9,5,0};
print(r,len(r));
//bubbleSort1(r,len(r));
//selectSort(r,len(r));
//insertSort(r,len(r));
//quickSort(r,len(r));
//myShellSort(r,len(r));
quickSort(r,0,len(r)-1);
print(r,len(r));
return 0;
}
好久都没有写排序了,最近闲的无事加上又要面试了,就写点吧!以上几种算法的自己模拟版本。
在写c++的过程当中,又发现了好多东西自己都不不会哎,比如说不同编译器对没有初始化的int赋值为多少呢?能不能写一个函数来求数组的长度呢?结果是不行的,c++中以参数的形式传递的时候,数组就退化为了指针,使用sizeof(arr)/sizeof(arr[0]),这就是为什么大神们网上晒出来的代码都要传递一个参数int length,别以为人家傻,人家聪明着呢!一开始都以为可以传一个数组的引用进来,然后递归的求长度,结果是不可行的!记住吧,以后就这么用了。
当然还有一个办法就是使用memset先将空数组都赋值为0!在根据这个来求!
浙公网安备 33010602011771号