幾道經典的數據結構算法代碼實現(1)

#include <iostream>
#include <vector>
#include <string>
#include <math.h>
using namespace std;

1.二分查找(搜索)

int main()
{
const int nSIZE = 6;
int n[nSIZE] = { 1,2,3,5,7,10};
vector<int> initA(n, n + nSIZE);


int searchM = 2;
int left = 0; int right = nSIZE-1;
while (left <= right)
{
int middle = (left + right) / 2;
if (initA[middle] == searchM)
{
cout << "在數組中位置:"<<middle << endl;
system("pause");
return 0;
}
if (initA[middle]>searchM)
right = middle - 1;
if (initA[middle]<searchM)
left = middle + 1;
}


cout << "do not find!" << endl;
system("pause");
return -1;
}

2.插入排序

int main()
{
const int nSIZE = 10;
int n[nSIZE] = { 22, 11, 33, 55, 40, 22, 11, 33, 55, 40 };


vector<int> initA(n, n + nSIZE);


for (int j= 1; j < nSIZE; j++)
{
for (int i = j; i >0; i--)
{
if (initA[i]<initA[i-1])
{
int temp = initA[i];
initA[i] = initA[i - 1];
initA[i-1] = temp;
}
else
break; 
}


}




for (int j = 0; j < initA.size(); j++)
cout << initA[j] << endl;
return 0;
}

3.快速排序

void quickSort(int s[], int l, int r)// int l:這是l.不是一
{
if (l< r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while (i < j && s[j] >= x) // 從右向左找第一個小於x的數  
j--;
if (i < j)
s[i++] = s[j];
while (i < j && s[i]< x) // 從左向右找第一個大於等於x的數  
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
//cout << i<<"  " << j << endl;




quickSort(s, l, i - 1); // 遞歸調用  
quickSort(s, i + 1, r);
}
}//


int main()
{
int array[] = { 34, 65, 12, 43, 67, 78, 78, 10, 3, 70 }, k;
int len = sizeof(array) / sizeof(int);
cout << "orginal arrayare:" << endl;
for (k = 0; k<len; k++)
cout << array[k] << ",";
cout << endl;


quickSort(array, 0, len - 1);
cout << "quickSorted arrayare:" << endl;
for (k = 0; k<len; k++)
cout << array[k] << ",";
cout << endl;

}

4.因式分解

int main()
{
vector<int>res;
int M = 30;
int index = 0;//終止符號-1
cout << M << "==";




while (index==0)
{
int flag = 0;
for (int i = 2; i <=sqrt(M); i++)
{
if (M%i == 0)
{
M = M / i;
flag = -1;
res.push_back(i);
break;
}

}


if (flag==0)
{
index = -1;
res.push_back(M);
}
}

//cout
for (int h = 0; h < res.size() - 1; h++)
cout << res[h] << "*";
cout << res[res.size() - 1] << endl;
return 0;
}



5.快排2(過程更容易理解)

#include <stdio.h> 
int n = 5;
int a[5] = {3,2,1,5,5};


void MYquickSort(int left, int right)
{
if (left > right)
{
return;
}


int i = left; //注意①i=left+1,就會報錯!!!
int j = right;
int tempB = a[left];


while (i != j)
{
while (a[j] >= tempB && i<j)//注意②:先遞減j,再遞加i,否則錯!!!                              注意③  && i<j要加進去,否則錯!!!
j--;
while (a[i] <= tempB && i<j)
i++;
//swap;
if (i < j)
{
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
//swap2:
a[left] = a[i];
a[i] = tempB;


MYquickSort(left, i - 1);
MYquickSort(i + 1, right);
}
void quicksort(int left, int right)
{
int i, j, t, temp;
if (left>right)
return;


temp = a[left]; //temp中存的就是基準數 
i = left;    
j = right;
while (i != j)
{
//順序很重要,要先從右邊開始找 
while (a[j] >= temp && i<j)
j--;
//再找右邊的 
while (a[i] <= temp && i<j)
i++;
//交換兩個數在數組中的位置 
if (i<j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//最終將基準數歸位 
a[left] = a[i];
a[i] = temp;


quicksort(left, i - 1);//繼續處理左邊的,這裏是一個遞歸的過程 
quicksort(i + 1, right);//繼續處理右邊的 ,這裏是一個遞歸的過程 
}
int main()
{
//讀入數據 
//n = 5;
//for (i = 0; i <n; i++)
// scanf("%d", &a[i]);
MYquickSort(0, n - 1); //快速排序調用 
//輸出排序後的結果 
for (int i = 0; i <n; i++)
printf("%d ", a[i]);
getchar(); 
return 0;
}

6.歸併排序

#include <iostream>
#include <string>
#include <vector>
using namespace std;


int n = 5;
int a[5] = {3,2,1,5,5};


void merge(int left,int mid,int right)
{
int i = left; int iright = mid;
int j = mid + 1; int jright = right;
vector<int> temp;


while ((i != iright + 1) && (j != jright + 1))
{
if (a[i] <= a[j])
{
temp.push_back(a[i]);
i++;
}
else 
{
temp.push_back(a[j]);
j++;
}
}
if (i == iright + 1)
for (int jj = j; jj != jright + 1; jj++)
{
temp.push_back(a[jj]);
}


if (j == jright + 1)
for (int ii = i; ii != iright + 1; ii++)
{
temp.push_back(a[ii]);
}
//
int idx = 0;
for (int hh = left; hh <= right; hh++)
{
a[hh] = temp[idx];
idx++;
}
}


void MYmergeSort(int left, int right)
{
if (left>=right)
return;
int mid = (left + right) / 2;
MYmergeSort(left, mid);
MYmergeSort(mid + 1, right);
merge(left,mid,right);
}


int main()
{
MYmergeSort(0, n - 1);
//輸出排序後的結果 
for (int i = 0; i <n; i++)
printf("%d ", a[i]);
system("pause");
return 0;
}


發佈了48 篇原創文章 · 獲贊 39 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章