c++冒泡排序
首先,先来一个最简单的,就是向后冒泡,复杂度为O(n^2),同等大小数字不会打乱原顺序
#include <iostream>
#include <ctime>
#define MAX 10
using namespace std;
void print(int *arr,int len)
{
if (len != 0 && arr != NULL)
{
for (int i = 0; i < len; ++i)
{
cout << arr[i] << " ";
}
}
}
void Swap(int &a, int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
void sort(int *arr, int len)
{
for (int i = 0; i < len; ++i)
{
for (int j = 0; j < len - i - 1; ++j)
{
if (arr[j] > arr[j + 1])
{
Swap(arr[j], arr[j + 1]);
}
}
}
}
int main(int argc, char *argv[])
{
srand((unsigned)time(NULL));
int arr[MAX];
for (int i = 0; i < MAX; ++i)
{
arr[i] = rand() % 100;
}
cout << "原数组" << endl;
print(arr, MAX);
sort(arr, MAX);
cout << endl << "排序后的数组" << endl;
print(arr, MAX);
return 0;
}
然后是向前冒泡,其实和向后冒泡基本一样
void sort(int *arr, int len)
{
for (int i = 0; i < len; ++i)
{
for (int j = len - 1; j > i; --j)
{
if (arr[j] < arr[j - 1])
{
Swap(arr[j], arr[j - 1]);
}
}
}
}
下来是单链表的冒泡排序,这个是断开链表重新接好,不是交换节点上的值所以对我来说写了好一会,而且有个问题是我在外层循环没有更好的控制结束标志,我都是以NULL作为结束的,这样就使得算法上不算好(冒泡本事效率也高不到哪去),所以是可以控制结束标志,略过已经排好序的后面的数据,不想写了。
#include <iostream>
#include <ctime>
#define MAX 10
using namespace std;
struct Data
{
int m_value;
Data *next;
};
void print(Data *data)
{
while (data != NULL)
{
cout << data->m_value << " ";
data = data->next;
}
cout << endl;
}
Data *create_singlelink()
{
int num = MAX;
Data *head = new Data;
head->m_value = rand() % 100;
head->next = NULL;
while(--num)
{
Data *tmp = new Data;
tmp->m_value = rand() % 100;
tmp->next = head;
head = tmp;
}
return head;
}
void Swap(Data *pre, Data *ap,Data *prespre) //交换pre和ap prespre作为pre的前驱
{
pre->next = ap->next;
ap->next = pre;
if(prespre != NULL)
prespre->next = ap;
}
void sort(Data *&head)
{
int tmp_max = MAX;
while (--tmp_max)
{
Data *tmp_head = head;
Data *prespre = NULL;
while (tmp_head->next != NULL)
{
if (tmp_head->m_value > tmp_head->next->m_value)
{
Data *next = tmp_head->next;
if (prespre == NULL)
{
Swap(tmp_head, next, NULL);
head = next;
}
else
{
Swap(tmp_head, next, prespre);
}
prespre = next;
}
else
{
prespre = tmp_head;
tmp_head = tmp_head->next;
}
}
print(head);
}
}
int main(int argc, char *argv[])
{
srand((unsigned)time(NULL));
Data *head = create_singlelink();
cout << "原数组" << endl;
print(head);
sort(head);
cout << endl << "排序后的数组" << endl;
print(head);
return 0;
}
以上就是我第一次写的吧,纪念一下20190603