一、冒泡排序
1、排序思想:假設對N個數進行排序,他們的位置分別是0、1、2....、N-1。首先比較0和1位置上的元素,如果0位置上的元素大於1位置上的元素,則交換兩個位置上的元素,否則不做調整;接着比較1位置上和2位置上的元素,如果1位置上的元素大於2位置上的元素,則交換兩個位置上的元素,否則不交換;..........;最後比較N-2和N-1位置上的元素,如果N-2位置上的元素大於N-1位置上的元素,則交換兩個位置上的元素,這樣經過一趟排序,最大的數就在N-1位置上。接着在0-N-2位置上繼續遍歷找出第二大的數放在N-2位置上,以此類推,從而得到一個升序排序序列。
2、代碼實現
#include<iostream>
using namespace std;
template<typename T>
void bubble_sort(T list[], int len) //冒泡升序排序
{
for (int i = len - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (list[j] > list[j + 1])
bubble_swap(list[j], list[j + 1]);
}
}
}
template<typename T> //使用到T的地方都需要加template
void bubble_swap(T &x, T &y) //交換兩個位置上的元素
{
T temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int nums[] = { 12,3,2,4,56,13,23,34,55 };
int len = (int) sizeof(nums) / sizeof(int);
bubble_sort(nums, len);
for (int i = 0; i < len; i++)
{
cout << nums[i]<<' ';
}
cout << endl;
system("pause");
return 0;
}
3、時間複雜度和空間複雜度
- 時間複雜度:O()
- 空間複雜度:O(1)
二、選擇排序
1、排序思想:每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。也就是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作爲有序序列中第i個記錄。
2、代碼實現
#include<iostream>
using namespace std;
template<typename T>
void select_sort(T list[], int len) //選擇排序:升序
{
for (int i = 0; i < len - 1; i++)
{
int minIndex = i; //記錄最小元素的下標
for (int j = i+1; j < len; j++)
{
minIndex = list[j] < list[minIndex] ? j : minIndex;
}
select_swap(list[i], list[minIndex]);
}
}
template<typename T> //使用到T的地方都需要加template
void select_swap(T &x, T &y) //交換兩個位置上的元素
{
T temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int nums[] = { 12,3,2,4,56,13,23,34,55 };
int len = (int) sizeof(nums) / sizeof(int);
select_sort(nums, len);
for (int i = 0; i < len; i++)
{
cout << nums[i]<<' ';
}
cout << endl;
system("pause");
return 0;
}
3、時間和空間複雜度
- 時間複雜度:O()
- 空間複雜度:O(1)
三、插入排序
1、排序思想:把幾個待排序的元素看成一個有序表和一個無序表,開始時有序表中只包含一個元素,假設序列第一個元素爲有序表,其餘都在無序表中,排序過程中,每次從無序表中取出第一個元素,將他與有序表中的元素進行比較,放到合適位置,使得插入該元素後的有序表仍就有序,即得到新的有序表;按照上述過程,逐個將無序表中的元素放到有序表中。
2、代碼實現
#include<iostream>
using namespace std;
template<typename T>
void insert_sort(T list[], int len)
{
for (int i = 1; i < len; i++)
{
for (int j = i-1; j >=0 && list[j] > list[j+1]; j--) //無序表中的第一個元素小於比較的元素就交換位置
{
insert_swap(list[j], list[j + 1]);
}
}
}
template<typename T> //使用到T的地方都需要加template
void insert_swap(T &x, T &y) //交換兩個位置上的元素
{
x = x^y; //炫酷的交換兩個元素的寫法
y = x^y;
x = x^y;
}
int main()
{
int nums[] = { 12,3,2,4,56,13,23,34,55 };
int len = (int) sizeof(nums) / sizeof(int);
insert_sort(nums, len);
for (int i = 0; i < len; i++)
{
cout << nums[i]<<' ';
}
cout << endl;
system("pause");
return 0;
}
3、時間和空間複雜度(複雜度和序列原始狀況有關)
- 原序列是升序序列:
- 時間複雜度:O(N)
- 空間複雜度:O(1)
- 原序列是降序序列:
- 時間複雜度:O()
- 空間複雜度:O(1)
注意:如果時間複雜度與序列狀況有關,則時間複雜度取最差情況下的時間複雜度