Thứ Hai, 2 tháng 1, 2017

Thuật toán sắp xếp chèn trực tiếp - Thuật toán sắp xếp Insertion Sort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
using namespace std;

#define MAX 100

// MẢNG 1 CHIỀU 
// 1. HÀM NHẬP SỐ PHẦN TỬ
void NhapN(int &N)
{
 do
 {
  cout << "Moi ban nhap so phan tu cua mang N = ";
  cin >> N;

  // 0 < N <= MAX
  // Điều kiện phải ngược lại 
  if (N <= 0 || N > MAX)
   cout << "Nhap sai vui long nhap la 0 < N <= " << MAX << "\n";

 } while (N <= 0 || N > MAX);
}

// 2. HÀM NHẬP MẢNG
void NhapMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << "A[" << i << "]= ";
  cin >> A[i];
 }
}

// 3. HÀM XUẤT MẢNG
void XuatMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << A[i] << "\t";
 }
}

// Hoán vị 2 số
void Swap(int &a, int &b)
{
 int t = a; a = b; b = t;
}

void InsertionSort(int A[], int N)
{
 int pos = 0, i = 0; // Khởi tạo giá trị
 int x = 0;//lưu giá trị a[i] tránh bị ghi đè khi dời chỗ các phần tử.  
 for (i = 1; i < N; i++) //đoạn a[0] đã sắp xếp 
 {
  x = A[i];
  pos = i - 1;   
  // tìm vị trí chèn x
  while ((pos >= 0) && (A[pos] > x))
  {
   //kết hợp dời chỗ các phần tử sẽ đứng sau x trong dãy mới
   A[pos + 1] = A[pos];
   pos--;
  }
  A[pos + 1] = x; // chèn x vào dãy  
 }
}


int main()
{

 int N = 0;
 NhapN(N);

 int A[MAX];
 NhapMang(A, N);
 cout << "MANG BAN DAU\n";
 XuatMang(A, N);
 cout << "\n";

 InsertionSort(A, N);
 cout << "Mang sau khi sap xep : \n";
 XuatMang(A, N);
 cout << "\n";

 return 0;
}

Không có nhận xét nào:

Đăng nhận xét